按关键字拆分文件

问题描述

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...