VB.Net编辑CSV(或分隔文件)
我想知道一种方法(当然我想知道最好的方法)来编辑一个csv文件,最好不必读取原始文件并将结果写入新文件 例1:我想把一列的内容分成两列123abc分成123,abc 示例2:我想将AB123列开头的字母删除为123 澄清:我不需要帮助解决我的例子;我只需要指向正确的方向来阅读和编辑同一个文件 下面是一个使用临时文件的代码示例,在我看来它太慢了VB.Net编辑CSV(或分隔文件),vb.net,csv,delimited,Vb.net,Csv,Delimited,我想知道一种方法(当然我想知道最好的方法)来编辑一个csv文件,最好不必读取原始文件并将结果写入新文件 例1:我想把一列的内容分成两列123abc分成123,abc 示例2:我想将AB123列开头的字母删除为123 澄清:我不需要帮助解决我的例子;我只需要指向正确的方向来阅读和编辑同一个文件 下面是一个使用临时文件的代码示例,在我看来它太慢了 Dim currentLine as string() tempFile.AutoFlush = True Do Until origFile.
Dim currentLine as string()
tempFile.AutoFlush = True
Do Until origFile.EndOfData
currentLine = origFile.ReadFields
currentLine(1) = currentLine(1).Replace("ABC","") 'would convert ABC123 to 123
For index as Integer = 0 to currentLine.Count - 2
tempFile.Write(currentLine(index) & ",")
Next
tempFile.Write(currentLine(currentLine.Count - 1))
tempFile.WriteLine()
Loop
tempFile.Flush()
tempFile.Dispose()
origFile.Dispose()
IO.File.Copy(tempFile,OrigFile,True)
IO.File.Delete(tempFile)
你最好写一个新文件。您可以写入临时文件,删除旧文件,并将新文件重命名为旧文件 比如:
Imports System.IO
Module Module1
Sub Main()
Dim tempfile = Path.GetTempFileName()
Dim inputFile = "C:\Temp\input.txt"
Using sw = New StreamWriter(tempfile)
Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser(inputFile)
MyReader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited
MyReader.Delimiters = New String() {","}
Dim currentRow As String()
While Not MyReader.EndOfData
Try
currentRow = MyReader.ReadFields()
If currentRow.Count >= 2 Then
currentRow(1) = currentRow(1).Replace("ABC", "")
End If
sw.WriteLine(String.Join(",", currentRow))
Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
MsgBox("Line " & ex.Message & " is invalid. Skipping")
End Try
End While
End Using
End Using
File.Delete(inputFile)
File.Move(tempfile, inputFile)
End Sub
End Module
(基本上是从中复制TextFieldParser示例)您最好编写一个新文件。您可以写入临时文件,删除旧文件,并将新文件重命名为旧文件 比如:
Imports System.IO
Module Module1
Sub Main()
Dim tempfile = Path.GetTempFileName()
Dim inputFile = "C:\Temp\input.txt"
Using sw = New StreamWriter(tempfile)
Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser(inputFile)
MyReader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited
MyReader.Delimiters = New String() {","}
Dim currentRow As String()
While Not MyReader.EndOfData
Try
currentRow = MyReader.ReadFields()
If currentRow.Count >= 2 Then
currentRow(1) = currentRow(1).Replace("ABC", "")
End If
sw.WriteLine(String.Join(",", currentRow))
Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
MsgBox("Line " & ex.Message & " is invalid. Skipping")
End Try
End While
End Using
End Using
File.Delete(inputFile)
File.Move(tempfile, inputFile)
End Sub
End Module
(基本上是从复制TextFieldParser示例)您可以使用ADO连接到CSV文件。有关更多信息,请参见此处: 不过,我建议只需将其加载到数组中,然后使用简单的文件IO方法将其写回。它只是大大减少了代码和开销:
For Each row As String In File.ReadAllLines("C:\test.csv")
For Each column As String In row.Split(New String() {","}, StringSplitOptions.None)
' Do work
Next
Next
然后类似这样的操作来保存文件:
File.WriteAllLines(rows)
您可以使用ADO连接到CSV文件。有关更多信息,请参见此处: 不过,我建议只需将其加载到数组中,然后使用简单的文件IO方法将其写回。它只是大大减少了代码和开销:
For Each row As String In File.ReadAllLines("C:\test.csv")
For Each column As String In row.Split(New String() {","}, StringSplitOptions.None)
' Do work
Next
Next
然后类似这样的操作来保存文件:
File.WriteAllLines(rows)
或者,他可以将旧文件读入内存,修改它,然后使用中间临时文件将其写回同一个文件,这样做的好处是,如果出现问题,不会丢失数据。此外,如果文件太大,无法放入内存,可以逐行读取以进行处理。谢谢。使用临时文件似乎太慢了。代码示例:Dim currentLine as string()tempFile.AutoFlush=True Do直到origFile.EndOfData currentLine=origFile.ReadFields currentLine(1)=currentLine(1)。Replace(“ABC”,“”)将ABC123转换为123,索引为整数=0到currentLine.Count-2 tempFile.Write(currentLine(index)&“,”)下一个tempFile.Write(currentLine(currentLine.Count-1))tempFile.WriteLine()循环tempFile.Flush()tempFile.Dispose()origFile.Dispose()IO.File.Copy(tempFile,origFile,True)IO.File.Delete(tempFile)`这个网站非常新…我如何正确响应,尤其是代码片段?@donbyte如果你将代码作为编辑添加到原始帖子中,我们将能够更好地看到它。或者,他可以将旧文件读入内存,修改它,然后使用中间临时文件写回同一文件,这样做的好处是如果出现问题,您不会丢失数据。此外,如果文件太大而无法放入内存,则可以逐行读取以进行处理。谢谢。使用临时文件似乎太慢。代码示例:Dim currentLine as string()tempFile.AutoFlush=True Do Until origFile.EndOfData currentLine=origFile.ReadFields currentLine(1)=currentLine(1).Replace(“ABC”,“”)会将索引为整数=0的ABC123转换为123,再转换为currentLine.Count-2 tempFile.Write(currentLine(index)&“,”)下一个tempFile.Write(currentLine(currentLine.Count-1))tempFile.WriteLine()循环tempFile.Flush()tempFile.Dispose()origFile.Dispose()IO.File.Copy(tempFile,origFile,True)IO.File.Delete(tempFile)`这个网站非常新……我如何正确地回应,尤其是对代码片段?@donbyte如果您将代码作为编辑添加到原始帖子中,我们将能够更好地看到它。