2014-01-21 26 views
1

内容内容的新文件如下:过滤CSV文件,并创建一个基于原始文件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

哪个元素决定文件1或文件2?有多个候选项出现 – Plutonix

+0

我按第一列过滤,其中包含“AH08B/0013XX” –

+0

我将使用LINQTOXML创建两个子列表http://www.dotnetcurry.com/showarticle.aspx?ID=564 – CheGueVerra

回答

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

下面是您的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(); 
} 
+0

初始化StreamWriter时只有一个警告:在mscorlib.dll中发生未处理的类型为“System.IO.IOException”的异常其他信息:进程无法访问文件'c:\ temp \ doc3.csv',因为它正在被使用通过另一个进程。 –

相关问题