2010-04-09 80 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