C#文本文件输入多文件输出

时间:2011-05-21 16:45:33

标签: c# parsing flat-file

我有一个看起来像这样的文件:

|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 |

我需要根据从位置2开始的前6个字符将文件分成多个文件。

文件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位数将根据客户的不同而有所变化。我不知道他们会是什么。

我唯一知道的是格式。

有人可以给我一个关于如何动态获取\维护这些信息的建议,以便我可以将其解析为单个文件吗?

4 个答案:

答案 0 :(得分:4)

我建议使用像TextFieldParser类这样的解析器。

您可以将数据读入内存,使用第一个字段对其进行排序,然后写出单个文件。

答案 1 :(得分: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   
}

答案 2 :(得分:1)

逐行阅读。从每一行获取代码并创建文件,将对打开的文件流的引用放入字典中,并将代码作为键。在每个下一行检查密钥的字典并使用打开的流或创建新流。读完所有文件后关闭所有流。

如果文件行的大小很大,该算法将阻止对文件行使用太多内存。

例如,对于解析每一行,您只需使用RegEx。

答案 3 :(得分: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
   }
}