【问题标题】:Split text file into array using multiple delimiters使用多个分隔符将文本文件拆分为数组
【发布时间】:2012-01-20 16:27:58
【问题描述】:

我有一些 2k 文件要逐块比较,但这些块的标识不同。 将每个文件拆分为适当的块列表然后将每个块类型与相同的块类型进行比较的最佳方法是什么?

方块类型:

  • HL*
  • EB*
  • SE*
  • 通用电气*
  • 国际能源署*

文件示例 - 我添加了空格以提高可读性,但文件没有空格。

    useless-Text-useless-Text-~
    useless-Text-useless-Text-useless-Text-~

    HL*Block1'HL'text-Block1'HL'text-Block1'HL'text-Block1'HL'text-~
    Block1'HL'text-Block1'HL'text-~

    HL*Block2'HL'text-Block2'HL'text-~
    Block2'HL'text-Block2'HL'text-~

    HL*Block3'HL'text-Block3'HL'text-Block3'HL'text-~
    Block3'HL'text-~

    EB*Block1'EB'Text-Block1'EB'Text-Block1'EB'Text-~
    Block1'EB'Text-Block1'EB'Text-~
    Block1'EB'Text-Block1'EB'Text-~

    EB*Block2'EB'Text-Block2'EB'Text-Block2'EB'Text-~
    Block2'EB'Text-Block2'EB'Text-~
    Block2'EB'Text-Block2'EB'Text-~

    EB*Block3'EB'Text-Block3'EB'Text-Block3'EB'Text-~
    Block3'EB'Text-Block3'EB'Text-~
    Block3'EB'Text-Block3'EB'Text-~

    EB*Block4'EB'Text-Block4'EB'Text-Block4'EB'Text-~
    Block4'EB'Text-Block4'EB'Text-~
    Block4'EB'Text-Block4'EB'Text-~

    EB*Block_N'EB'Text-Block_N'EB'Text-Block_N'EB'Text-~
    Block_N'EB'Text-Block_N'EB'Text-~
    Block_N'EB'Text-Block_N'EB'Text-~

    SE*Block1'SE'Text-Block1'SE'Text-~
    Block1'SE'Text-~

    GE*Block1'GE'Text-~
    IEA*Block1'IEA'Text-~

【问题讨论】:

  • 这不是有效格式的 EDI。您的段分隔符 ~ 位于每个 EB 段的中间:Block1 应该是段的名称吗?
  • 我认为~ 是他的意思,没有空格。相反,他添加了这个符号以表明它连接到下一行,没有空格。
  • @Doomsknight:他应该澄清一下,因为我认为这不是一个安全的假设。 ~ 是 EDI 中典型的段分隔符;如果不是这里的那个,那么他就没有使用一个,这也使得这无效。同样,* 是他使用的典型元素分隔符;但他显然也使用' 作为另一个元素分隔符——进一步增加了这段代码的奇异性质。
  • 你的权利,他应该澄清。 :) 每个Text- 后面跟着Block 似乎很奇怪,除了行尾。我可以理解他为什么这样做,但是在代码中添加语法可能会非常误导。
  • 您真正想要提取哪些数据?

标签: c# text split edi


【解决方案1】:

如果您可以识别或了解模式,那么最好的方法是使用正则表达式。 周边教程很多,看看Parse Text Files With Regular Expressions

【讨论】:

  • +1。这是一个很好的链接,它将找到所有块并将其添加到数组中。 msdn.microsoft.com/en-us/library/8yttk7sy.aspx(你需要一个合适的正则表达式)
  • @Doomsknight 当你说“+1”时,你真的不应该投票给答案吗?
  • 糟糕,我以为我感冒了 ;) 感冒了,而且很累。 :p 我的错。现已添加 +1。
【解决方案2】:

我最终从下往上解析文本文件并将这些部分添加到列表中

        List<String> listHL_Base = new List<String>();
        List<String> listEB_Base = new List<String>();
        List<String> listSE_Base = new List<String>();

        StreamReader streamReader = new StreamReader(baseFile);
        string textBASE = streamReader.ReadToEnd().Trim();
        streamReader.Close();

        //we start scanning file from the button to up)           
        string[] textBASE_Step1 = Regex.Split(textBASE, "GE\\*");
        textBASE = textBASE_Step1[0];

        string[] textBASE_Step2 = Regex.Split(textBASE, "SE\\*");
        for (int i = 1; i < textBASE_Step2.Length; i++) //creating list with SE values
        {
            listSE_Base.Add(textBASE_Step2[i]);
        }

        textBASE = textBASE_Step2[0]; //remainder (beginning) of the file, without GE, or SE. Only  EB's and HL's Left
        string[] textBASE_Step3 = Regex.Split(textBASE, "EB\\*");
        for (int i = 1; i < textBASE_Step3.Length; i++) //creating list with EB values
        {
            listEB_Base.Add(textBASE_Step3[i]);
        }

【讨论】:

    猜你喜欢
    • 2010-10-27
    • 2016-08-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 2012-07-04
    相关资源
    最近更新 更多