我正在尝试用VB.NET解析csv文件.
csv文件包含值0,"1,2,3",4,它分为5而不是3.Stockoverflow中有很多其他语言的例子,但我无法在VB.NET中实现它.这是我的代码到目前为止,但它不起作用...
Dim t As String() = Regex.Split(str(i), ",(?=([^\""]*\""[^\""]*\"")*[^\""]*$)")
Run Code Online (Sandbox Code Playgroud)
假设你的csv格式正确("除了用于分隔字符串字段的那些,或者除了那些转义之外\"),你可以拆分逗号后面跟着偶数个非转义的"-marks".(如果你是在一组""中,只剩下一个奇数.
你尝试过的正则表达式看起来就像你在那里一样.
以下查找逗号后跟偶数个引号:
,(?=([^"]*"[^"]*")*[^"]*$)
Run Code Online (Sandbox Code Playgroud)
要修改它以查找偶数个非转义引号(假设引号用反斜杠转义\"),我将每个引号替换[^"]为([^"\\]|\\.).这意味着"匹配不是"的字符而不是黑色字符,或者匹配反斜杠和紧随其后的字符".
,(?=(([^"\\]|\\.)*"([^"\\]|\\.)*")*([^"\\]|\\.)*$)
Run Code Online (Sandbox Code Playgroud)
在这里看到它.(反斜杠加倍的原因是我希望匹配文字反斜杠).
现在要进入vb.net,您只需要将所有引号加倍:
splitRegex = ",(?=(([^""\\]|\\.)*""([^""\\]|\\.)*"")*([^""\\]|\\.)*$)"
Run Code Online (Sandbox Code Playgroud)
不要使用正则表达式,而是尝试使用TextFieldParser类来读取.csv文件.它完全处理你的情况.
特别要看HasFieldsEnclosedInQuotes属性.
例:
注意:我使用的是字符串而不是文件,但结果是相同的.
Dim theString As String = "1,""2,3,4"",5"
Using rdr As New StringReader(theString)
Using parser As New TextFieldParser(rdr)
parser.TextFieldType = FieldType.Delimited
parser.Delimiters = New String() {","}
parser.HasFieldsEnclosedInQuotes = True
Dim fields() As String = parser.ReadFields()
For i As Integer = 0 To fields.Length - 1
Console.WriteLine("Field {0}: {1}", i, fields(i))
Next
End Using
End Using
Run Code Online (Sandbox Code Playgroud)
输出:
Field 0: 1
Field 1: 2,3,4
Field 2: 5
Run Code Online (Sandbox Code Playgroud)