1

できれば元のファイルを読み取って結果を新しいファイルに書き込むことなく、csv ファイルを編集する方法を知りたい (もちろん、最善の方法を知りたい)。

例 1: 列の内容を 2 つの列 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 Datatable に読み込む方法

ただし、単純に配列にロードしてから、単純なファイル 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 に答える