Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 过滤CSV文件并根据原始文件的内容创建新文件_Vb.net_File_Csv_Filtering - Fatal编程技术网

Vb.net 过滤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 按第一列筛

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

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

只要文件不是太大而无法放入内存,类似这样的方法应该可以工作:

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”,因为它正被另一个进程使用。