VB.Net编辑CSV(或分隔文件)

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.

我想知道一种方法(当然我想知道最好的方法)来编辑一个csv文件,最好不必读取原始文件并将结果写入新文件

例1:我想把一列的内容分成两列123abc分成123,abc

示例2:我想将AB123列开头的字母删除为123

澄清:我不需要帮助解决我的例子;我只需要指向正确的方向来阅读和编辑同一个文件

下面是一个使用临时文件的代码示例,在我看来它太慢了

    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如果您将代码作为编辑添加到原始帖子中,我们将能够更好地看到它。