Vb.net 过滤CSV文件并根据原始文件的内容创建新文件
原始文件DOC.csv的内容如下:Vb.net 过滤CSV文件并根据原始文件的内容创建新文件,vb.net,file,csv,filtering,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 按第一列筛
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
获得这些结果的最佳方法是什么?只要文件不是太大而无法放入内存,类似这样的方法应该可以工作:
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”。下面从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();
}
哪个元素决定文件1或文件2???第一列包含“AH08B/0013XX”,它将显示多个候选项我将使用LINQTOXML创建两个子列表初始化StreamWriter时只有一个警告:mscorlib.dll中发生“System.IO.IOException”类型的未处理异常其他信息:进程无法访问文件“c:\temp\doc3.csv”,因为它正被另一个进程使用。