2012-01-20 121 views
2

我有一些2k文件要逐塊比較,但這些塊標識不同。 將每個文件拆分成適當的塊列表然後將每個塊類型與相同塊類型進行比較的最佳方法是什麼?使用多個分隔符將文本文件拆分爲數組

塊類型:

  • HL *
  • EB *
  • SE *
  • GE *
  • IEA *

我添加空間的文件級的實施例更好的可讀性,但文件沒有空格。

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-~ 
+1

這不是格式正確EDI。你的分段分隔符「〜」位於你的每個「EB」段的中間:「Block1」應該是段的名稱嗎? –

+0

我假設'〜'是他沒有空格的意思。相反,他添加了這個符號來表明它沒有空間就加入到下一行。 – Doomsknight

+1

@Doomsknight:他應該澄清,因爲我不認爲這是一個安全的假設。 '〜'是EDI中的典型分段分隔符;如果不是這裏的那個,那麼他不會使用一個,這也使得這個無效。同樣,'*'是典型的元素分隔符,他使用;但他也使用'''顯然是另一個元素分隔符 - 進一步增加了此代碼的奇異性。 –

回答

0

我結束了自底向上解析文本文件,並添加這些節到列表

 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]); 
     } 
1

如果您能識別或知道模式,那麼最好的方法是使用正則表達式。 有很多教程,看看Parse Text Files With Regular Expressions

+0

+1。這是一個很好的鏈接,它將查找所有塊並將其添加到數組中。 http://msdn.microsoft.com/en-us/library/8yttk7sy.aspx(你將需要一個適當的正則表達式) – Doomsknight

+3

@Doomsknight當你說「+1」時,你不應該真正投票答案嗎? – LarsTech

+0

Woops認爲我有;)感冒了,非常疲憊。 :p我的不好。 +1現在添加。 – Doomsknight