过滤CSV文件并根据原始内容创建新文件

时间:2014-01-21 19:04:05

标签: vb.net file csv filtering

原始文件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

获得这些结果的最佳方法是什么?

2 个答案:

答案 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();
}
相关问题