如何解决按关键字拆分文件
在我的工作中,我们使用 EDI UNIFACT,我正在尝试导入这些消息。 我正在使用一个接受文件(streamreader)并映射信息的开源库,问题是我收到的一些文件没有这个库的正确格式。
每条消息都以 UNB ... 开始,以 UNZ ... 结束 ...
UNB+UNOA:2+
UNH+1+CODECO
.........
UNT+19+1'
UNZ+1+144427'
------------------> I need to separate here
UNB+UNOA:2+
UNH+1+CODECO
.......
UNT+19+1'
UNZ+1+144427'
.....
foreach (string filename in Directory.GetFiles(path))
{
using (var stream = new StreamReader(filename))
{
while (!stream.EndOfStream)
{
var line = stream.ReadLine();
if (line.Contains(@"CODECO")) //Codeco
{
stream.discardBufferedData();
stream.BaseStream.Seek(0,System.IO.SeekOrigin.Begin);
var grammar_read = EdiGrammar.NewEdiFact();
var interchange = default(Interchange<CODECO_D95B>);
interchange = new Ediserializer().Deserialize<Interchange<CODECO_D95B>>(stream,grammar_read);
if (interchange != null)
list.AddRange(ImportCODECO(interchange));
}
}
}
我的问题是,拆分这些文件,这样我就可以分别输入来自文件的每个块的信息?
非常感谢
解决方法
要分离和收集您需要创建开始状态和结束状态之间的内容,每个开始结束循环都会重置。在每个循环中,您都将在 StringBuilder 中收集数据并收集到例如列表中。
我已经制定了一个概念性的工作解决方案,我很确定以后可以对其进行优化。
为此,我创建了如下输入:
UNB+UNOA:2+
UNH+1+CODECO
My text1 chunk1
My text2 chunk1
My text3 chunk1
UNT+19+1'
UNZ+1+144427'
UNB+UNOA:2+
UNH+1+CODECO
My text1 chunk2
My text2 chunk2
My text3 chunk2
UNT+19+1'
UNZ+1+144427'
所以我将把第一个和第二个分开并收集它们之间的块数据。
string startSyntax1 = "UNB+UNOA:2+";
string startSyntax2 = "UNH+1+CODECO";
string endSyntax1 = "UNT+19+1'";
string endSyntax2 = "UNZ+1+144427'";
List<string> chunks = new List<string>();
bool startState = false;
bool endState = false;
StringBuilder sb = null;
foreach (var s in lines)
{
if (s.StartsWith(startSyntax1) && !startState)
{
sb = new StringBuilder();
startState = true;
}
if (startState)
{
if (!startSyntax1.StartsWith(s) && !startSyntax2.StartsWith(s) && !endSyntax1.StartsWith(s) && !endSyntax2.StartsWith(s))
{
sb.Append($"{s}{Environment.NewLine}");
}
endState = s.StartsWith(endSyntax2);
}
if (startState && endState)
{
var text = sb.ToString();
chunks.Add(text);
startState = false;
endState = false;
}
}
如果我们现在打印列表,我们会得到以下输出:
My text1 chunk1
My text2 chunk1
My text3 chunk1
My text1 chunk2
My text2 chunk2
My text3 chunk2
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。