在我的工作中,我们使用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