原始文件DOC.csv的内容如下:
AH08B/001319;F09351812;F09351812;F09351812;20131112;101009;10;3.30;15.00;0
AH08B/001319;F09351812;F09351812;F09351812;20131112;101009;10;3.30;15.00;0
AH08B/001320;F09351812;F09351812;F09351812;20131112;101271;400;1.30;5.00;10
按第一列过滤该文件,我需要获取两个新文件:
档案1
AH08B/001319;F09351812;F09351812;F09351812;20131112;101009;10;3.30;15.00;0
AH08B/001319;F09351812;F09351812;F09351812;20131112;101009;10;3.30;15.00;0
文件2
AH08B/001320;F09351812;F09351812;F09351812;20131112;101271;400;1.30;5.00;10
获得这些结果的最佳方法是什么?
答案 0 :(得分:2)
只要文件不是太大而不适合内存,这样的事情就可以了:
Dim groups = IO.File.ReadAllLines("DOC.csv").GroupBy(Function(x) x.Substring(0, x.IndexOf(";"c)))
For i = 0 To groups.Count - 1
IO.File.WriteAllLines("DOC" & (i + 1).ToString.PadLeft(2, "0"c) & ".csv", groups(i).ToArray)
Next
如果记忆是一个问题,这里有一种方法可行:
Dim keys As New List(Of String)
Using sr As New IO.StreamReader("textfile1.txt")
Do Until sr.EndOfStream
Dim line = sr.ReadLine
Dim key As String = line.Substring(0, line.IndexOf(";"c))
If keys.Contains(key) Then
IO.File.AppendAllText("DOC" & (keys.IndexOf(key) + 1).ToString.PadLeft(2, "0"c) & ".csv", line & vbNewLine)
Else
keys.Add(key)
IO.File.WriteAllText("DOC" & keys.Count.ToString.PadLeft(2, "0"c) & ".csv", line & vbNewLine)
End If
Loop
End Using
无论哪种方式都会创建文件,其中的行按照第一个字段分组,文件名的格式为“DOCxx.csv”。
答案 1 :(得分:1)
下面是csv文件中的第一个元素,如果不存在则创建一个新文件,然后将记录添加到该文件中。这是逐行处理的(例如,未针对速度进行优化),但不应该遇到内存约束。
string fileName = "C:\\Temp\\T1.csv";
if (File.Exists(fileName))
{
StreamReader sr = new StreamReader(fileName);
while (!sr.EndOfStream)
{
string record = sr.ReadLine();
string newFileName = "C:\\Temp\\" + record.Substring(0, record.IndexOf(";")) + ".csv";
if (!File.Exists(newFileName))
{
File.Create(newFileName);
}
StreamWriter sw = new StreamWriter(newFileName, true);
sw.WriteLine(record);
sw.Close();
}
sr.Close();
}