2012-06-15 24 views
1

我想知道一種方法(當然我想知道最好的方法)編輯一個csv文件,最好不必讀取原始文件並將結果寫入一個新的。VB.Net編輯一個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

你真的最好是去寫一個新的文件。您可以寫入臨時文件,刪除舊文件並將新文件重命名爲舊文件。

喜歡的東西:

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例子)

+1

或者他可以讀取舊文件到內存中,修改它,然後寫回到相同的文件 – briddums

+0

使用中間臨時文件的優點是,如果出現問題,您不會丟失數據。另外,如果文件太大而無法放入內存,則可逐行讀取以進行處理。 –

+0

謝謝。使用臨時文件似乎太慢了。代碼例如:昏暗currentLine作爲字符串() tempFile.AutoFlush =真 做,直到origFile.EndOfData \t currentLine = origFile.ReadFields \t currentLine(1)= currentLine(1).Replace( 「ABC」, 「」) 「將ABC123轉換爲123 \t對於索引爲整數= 0至currentLine.Count - 2 \t \t tempFile.Write(currentLine(索引) 「」) \t接着 \t \t tempFile.Write(currentLine(currentLine。 Count - 1)) \t \t tempFile.WriteLine() 環 tempFile.Flush() tempFile.Dispose() origFile.Dispose() IO.File.Copy(臨時文件,OrigFile,真) IO.File.Delete(臨時文件)' – donbyte

0

您可以使用ADO連接到CSV文件。在這裏看到更多的信息:

How to read a CSV file into a .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)