2011-05-21 122 views
6

我有一個看起來是這樣的文件:C#文本文件輸入多文件輸出

|29923C|SomeGuy,NameHere1  |00039252|042311|Some Address Info Here | 
|47422K|SomeGuy,NameHere2  |00039252|042311|Some Address Info Here | 
|98753D|SomeGuy,NameHere3  |00039252|042311|Some Address Info Here | 
|29923C|SomeGuy,NameHere4  |00039252|042311|Some Address Info Here | 
|47422K|SomeGuy,NameHere5  |00039252|042311|Some Address Info Here | 

我需要打破文件成基於前6個字符的多個文件在位置2

開始

文件1名爲29923c.asc:

|29923C|SomeGuy,NameHere1  |00039252|042311|Some Address Info Here | 
|29923C|SomeGuy,NameHere4  |00039252|042311|Some Address Info Here | 

文件第2項47422K.asc:

|47422K|SomeGuy,NameHere5  |00039252|042311|Some Address Info Here | 
|47422K|SomeGuy,NameHere2  |00039252|042311|Some Address Info Here | 

文件名爲3 9875D.asc:

|98753D|SomeGuy,NameHere3  |00039252|042311|Some Address Info Here | 

我不知道會是什麼文件中的程序得到它,只是格式之前。這6位數字將根據客戶而改變。我不知道他們會是什麼。

我唯一知道的就是格式。

任何人都可以給我一個關於如何動態獲取\維護這些信息的建議,以便我可以將其解析爲單個文件?

+0

哇,我覺得自己像一個傻瓜。我其他人正在想這種方式很多大聲笑。謝謝(你的)信息!每個人的答案都可以工作,我很感謝幫助! – ErocM 2011-05-21 16:56:04

回答

1

逐行閱讀。從每一行獲取代碼並創建文件,將打開的文件流的引用以代碼作爲關鍵字添加到字典中。在每一行檢查密鑰的字典並使用打開的流或創建一個新的流。讀完所有文件後關閉所有流。

如果文件大小很大,該算法將防止爲文件行使用太多的內存。

例如,對於解析每一行,您可以簡單地使用RegEx。

+1

這是處理它的最簡單方法。我讀了一行,然後將它輸出到它需要的文件中。我輸出的每個文件都添加到字典中,以便我知道我必須處理一次。 – ErocM 2011-06-07 17:39:14

4

我建議使用一個解析器,例如TextFieldParser類。

您可以將數據讀入內存,使用第一個字段進行排序然後寫出單個文件。

2
List<string> lines ; // load lines form file 

Dictionary<string,List<string>> dic = new Dictionary<string,List<string>>(); 
foreach(string line in lines) 
{ 
    string key = line.Split('|')[0]; 

    if(!dic.ContainsKey(key)) 
     dic.Add(key,new List<string>{line}); 
    else 
     dic[key].Add(line) 
} 

foreach(var pair in dic) 
{ 
    //create file and store there pair.Value 
} 
+0

如果文件尺寸很大,會出現什麼情況?全部存儲到內存? – 2011-05-21 16:54:53

+0

@archer ErocM沒有指定該文件是非常巨大的 – Stecya 2011-05-21 16:57:16

+0

最多可能是幾百行。 – ErocM 2011-05-21 17:00:59

0

你可以用蠻力的方式做到這一點。

閱讀:

Dictionary<string, List<string>> DICT; 
Until End of File { 
    Read a line to LINE 
    Read characters 1-7 in LINE to CUSTOMERID 
    DICT[CUSTOMERID].Add(LINE); 
} 

寫作:

foreach KeyValuePair entry in DICT { 
    Create file with name entry.Key 
    foreach string line in entry.Value { 
     Write line to file line 
    } 
}