2012-11-07 45 views
0

我有一個平坦的文件,它是管道分隔,看起來像這樣的例子C#最好的方法來解析平面文件,每行字段

可樂的動態數量| COLB | 3 * |注1 |注2 |注3 | 2 ** | A1 | A2 | A3 | B1 | B2 | B3

前兩列已設置並始終存在。

*表示用於多少重複字段會有以下的是計數所以備註1 2 3

**表示爲字段的塊多少次重複的計數的計數和總有在3個字段一個塊。

這是每行,所以每行可能有不同數量的字段。

希望至今有道理。

我試圖找到解析這個文件的最佳方式,任何建議都會很棒。

最終的目標是將所有這些字段映射到幾個不同的文件 - 數據轉換。實際上,我在SSIS中做了所有這些工作,但認爲默認組件不夠好,所以需要編寫自己的代碼。

更新我基本上試圖讀取這個像一個源文件,並對其中的一些字段進行一些查找和字符串處理,並將任何普通文件中的多個不同文件吐出到文件轉換SSIS包中。

使用上面的例子,我可能要創建結束這樣看

「可樂」,「HardcodedString」,「Note1CRLFNote2CRLF」,「COLB」

然後另一個文件中的新文件

ROW1: 「可樂」, 「A1」, 「A2」, 「A3」

行2: 「可樂」, 「B1」, 「B2」, 「B3」

所以我想我在對如何解析t的一些想法之後他以及將數據存儲在堆棧或列表中或?以後再玩並吐出。

+0

我感應的方式來做到這一點使用[谷歌瑞風(http://code.google.com/p/google-改進/),但我看不到它。看起來像你可以輸出Xml/JSON,這應該更容易解析。 –

+0

你能舉一個你試圖擺脫這個問題的例子嗎?可能有助於指導我們解決方案。 –

+0

我已經更新了一些更多的信息,希望有所幫助。 – kouri

回答

2

一種可能性是使用堆棧。首先你通過管道分割線。

var stack = new Stack<string>(line.Split('|')); 

然後你從堆棧中彈出前兩個讓它們擋開。

stack.Pop(); 
stack.Pop(); 

然後你解析下一個元素:3 *。爲此,您彈出堆棧中的下3個項目。用2 **從堆棧中彈出接下來的2 x 3 = 6項,依此類推。您可以立即停止堆棧清空。

while (stack.Count > 0) 
{ 
    // Parse elements like 3* 
} 

希望這已經夠清楚了。當談到String.Split()時,我發現this article非常有用。

-1
System.IO.File.ReadAllLines("File.txt").Select(line => line.Split(new[] {'|'})) 
+0

-1用於在一行代碼中組合多個邏輯步驟。 –

+0

我剛剛給出了一個想法,但尚未準備好使用代碼,正如最初@muddy要求提供建議 –

1

的東西類似下面應該工作(這是未經測試)

ColA|ColB|3*|Note1|Note2|Note3|2**|A1|A2|A3|B1|B2|B3 

string[] columns = line.Split('|'); 
List<string> repeatingColumnNames = new List<string(); 
List<List<string>> repeatingFieldValues = new List<List<string>>(); 
if(columns.Length > 2) 
{ 
    int repeatingFieldCountIndex = columns[2]; 
    int repeatingFieldStartIndex = repeatingFieldCountIndex + 1; 
    for(int i = 0; i < repeatingFieldCountIndex; i++) 
    { 
     repeatingColumnNames.Add(columns[repeatingFieldStartIndex + i]); 
    } 

    int repeatingFieldSetCountIndex = columns[2 + repeatingFieldCount + 1]; 
    int repeatingFieldSetStartIndex = repeatingFieldSetCountIndex + 1; 

    for(int i = 0; i < repeatingFieldSetCount; i++) 
    { 
     string[] fieldSet = new string[repeatingFieldCount](); 

     for(int j = 0; j < repeatingFieldCountIndex; j++) 
     {        
      fieldSet[j] = columns[repeatingFieldSetStartIndex + j + (i * repeatingFieldSetCount))]; 
     } 
     repeatingFieldValues.Add(new List<string>(fieldSet)); 
    } 
}