2010-04-09 34 views
4

我正在尋找一個正則表達式,它將一次解析csv文件中的一行。基本上,string.readline()會做什麼,但是如果它們在雙引號內,它將允許換行。正則表達式解析csv

還是有更簡單的方法來做到這一點?

+1

我不明白爲什麼人們對Stack Overflow的正則表達式癡迷。我理解他們的實用性,但我不明白爲什麼你不能只使用CSV解析器。 – avpx 2010-04-09 22:41:08

+0

有這麼多的第三方CSV解析庫,並沒有一個使用正則表達式。僅僅因爲這不是它的正確工具*。 – BalusC 2010-04-09 22:46:18

+0

我完全理解,因爲它提供了一個簡單修復的誘惑。如果你不太瞭解正則表達式,它有時看起來像任何文本處理問題可以在一個單一的正則表達式中解決。而查找,連接和測試解析器似乎可以通過比較來嚇倒。 – tloflin 2010-04-09 22:47:17

回答

5

使用正則表達式解析CSV是罰款在良好控制的CSV數據簡單的應用程序,但往往有這麼多陷阱,如中引用的字符串轉義的嵌入式引號和逗號等,這往往使正則表達式對這個任務來說是棘手和冒險的。

我推薦一個經過充分測試的CSV模塊用於您的目的。

- 編輯 - 看到這個優秀的文章,Stop Rolling Your Own CSV Parser!

0

而不是依靠易出錯的正則表達式,在simpified「分裂」的邏輯或第三方組件,使用.NET框架的內置功能:

Using Reader As New Microsoft.VisualBasic.FileIO.TextFieldParser("C:\MyFile.csv") 

    Reader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited 

    Dim MyDelimeters(0 To 0) As String 
    Reader.HasFieldsEnclosedInQuotes = False 
    Reader.SetDelimiters(","c) 

    Dim currentRow As String() 
    While Not Reader.EndOfData 
     Try 
      currentRow = Reader.ReadFields() 
      Dim currentField As String 
      For Each currentField In currentRow 
       MsgBox(currentField) 
      Next 
     Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException 
      MsgBox("Line " & ex.Message & 
      "is not valid and will be skipped.") 
     End Try 
    End While 
End Using