我正在尝试使用VB.NET解析csv文件。
csv文件包含的值如0,“1,2,3”,4分为5而不是3。Stockoverflow中有很多其他语言的例子,但我无法在VB.NET中实现它。 到目前为止,这是我的代码,但它不起作用......
Dim t As String() = Regex.Split(str(i), ",(?=([^\""]*\""[^\""]*\"")*[^\""]*$)")
答案 0 :(得分:8)
假设你的csv格式正确(除了用于分隔字符串字段的那些之外没有"
,或者除了像\"
之类的那些转义之外),你可以拆分一个后面跟着偶数个非转义的“-marks”。(如果你在一组“”里面,那里只剩下一个奇数)。
你试过的正则表达式看起来就像你在那里一样。
以下是逗号,后跟偶数个引号:
,(?=([^"]*"[^"]*")*[^"]*$)
要修改它以查找偶数个非转义引号(假设引号用{(1}}反斜杠转义),我将每个\"
替换为[^"]
([^"\\]|\\.)
。这意味着“匹配不是”的字符而不是黑色字符,或者匹配反斜杠和紧随其后的字符“。
,(?=(([^"\\]|\\.)*"([^"\\]|\\.)*")*([^"\\]|\\.)*$)
在行动here中查看。 (反斜杠加倍的原因是我想匹配文字反斜杠)。
现在要进入vb.net,你只需要将所有引号加倍:
splitRegex = ",(?=(([^""\\]|\\.)*""([^""\\]|\\.)*"")*([^""\\]|\\.)*$)"
答案 1 :(得分:5)
尝试使用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
输出:
Field 0: 1
Field 1: 2,3,4
Field 2: 5
答案 2 :(得分:0)
这对于解析我们收到的送货通知.csv文件非常有用。感谢您保留此解决方案。
这是我的代码版本:
Try
Using rdr As New IO.StringReader(Row.FlatFile)
Using parser As New FileIO.TextFieldParser(rdr)
parser.TextFieldType = FileIO.FieldType.Delimited
parser.Delimiters = New String() {","}
parser.HasFieldsEnclosedInQuotes = True
Dim fields() As String = parser.ReadFields()
Row.Account = fields(0).ToString().Trim()
Row.AccountName = fields.GetValue(1).ToString().Trim()
Row.Status = fields.GetValue(2).ToString().Trim()
Row.PONumber = fields.GetValue(3).ToString().Trim()
Row.ErrorMessage = ""
End Using
End Using
Catch ex As Exception
Row.ErrorMessage = ex.Message
End Try
答案 3 :(得分:0)
可以通过以下方式使用regex VB.NET来实现:
,(?=(?:[^"]*"[^"]*")*[^"]*$)
正向前瞻((?= ...))确保在逗号之前存在偶数引号(即,它们成对出现,或者没有)。
[^“] *匹配非引号字符。
下面给出了一个应用正则表达式的VB.NET示例。
Imports System
Imports System.Text.RegularExpressions
Public Class Test
Public Shared Sub Main()
Dim theString As String = "1,""2,3,4"",5"
Dim theStringArray As String() = Regex.Split(theString, ",(?=(?:[^""\\]*""[^""\\]*"")*[^""\\]*$)")
For i As Integer = 0 To theStringArray.Length - 1
Console.WriteLine("theStringArray {0}: {1}", i, theStringArray(i))
Next
End Sub
End Class
'Output:
'theStringArray 0: 1
'theStringArray 1: "2,3,4"
'theStringArray 2: 5