2011-05-21 100 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 
    } 
}