1

我想知道一种编辑 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)
4

2 回答 2

4

你真的最好写一个新文件。您可以写入临时文件,删除旧文件并将新文件重命名为旧文件。

就像是:

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

(基本上从http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.readfields.aspx复制 TextFieldParser 示例)

于 2012-06-15T18:11:52.490 回答
0

您可以使用 ADO 连接到 CSV 文件。请参阅此处了解更多信息:

如何将 CSV 文件读入 .NET 数据表

但是,我建议将其加载到数组中,然后使用简单的文件 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)
于 2012-06-15T18:18:53.743 回答