使用正则表达式将逗号分隔的字符串分隔为数组

时间:2013-06-24 22:09:55

标签: regex vb.net csv split

我有一个如下所示的字符串,需要使用VB.NET

拆分为数组
  

10,"测试,t1",10.1 ,,," 123"

结果数组必须有6行,如下所示

10
Test, t1
10.1
(empty)
(empty)
123

所以: 1.必须删除字符串周围的引号 2.逗号可以在字符串内部,并保留在那里(结果数组中的第2行) 3.可以有空字段(源字符串中逗号后面的逗号,中间没有任何内容)

由于

4 个答案:

答案 0 :(得分:4)

不要使用String.Split():它很慢,并且不会考虑许多可能的边缘情况。

不要使用RegEx。 RegEx可以准确地做到这一点,但为了正确地解释所有情况,表达式往往非常复杂,难以维护,并且此时并不比.Split()选项快得多。 / p>

使用专用的CSV解析器。选项包括Microsoft.VisualBasic.TextFieldParser类型,FastCSVlinq-to-csvparser I wrote以获得其他答案。

答案 1 :(得分:1)

您可以自己编写一个函数。这应该可以解决问题:

Dim values as New List(Of String)
Dim currentValueIsString as Boolean
Dim valueSeparator as Char = ","c
Dim currentValue as String = String.Empty

For Each c as Char in inputString
   If c = """"c Then
     If currentValueIsString Then
        currentValueIsString = False
     Else 
        currentValueIsString = True
     End If
   End If

   If c = valueSeparator Andalso not currentValueIsString Then
     If String.IsNullOrEmpty(currentValue) Then currentValue = "(empty)"
     values.Add(currentValue)
     currentValue = String.Empty
   End If

   currentValue += c
Next

答案 2 :(得分:1)

这是另一种通过分隔符而不是字符循环的简单方法:

Public Function Parser(ByVal ParseString As String) As List(Of String)
    Dim Trimmer() As Char = {Chr(34), Chr(44)}
    Parser = New List(Of String)
    While ParseString.Length > 1
        Dim TempString As String = ""
        If ParseString.StartsWith(Trimmer(0)) Then
            ParseString = ParseString.TrimStart(Trimmer)
            Parser.Add(ParseString.Substring(0, ParseString.IndexOf(Trimmer(0))))
            ParseString = ParseString.Substring(Parser.Last.Length)
            ParseString = ParseString.TrimStart(Trimmer)
        ElseIf ParseString.StartsWith(Trimmer(1)) Then
            Parser.Add("")
            ParseString = ParseString.Substring(1)
        Else
            Parser.Add(ParseString.Substring(0, ParseString.IndexOf(Trimmer(1))))
            ParseString = ParseString.Substring(ParseString.IndexOf(Trimmer(1)) + 1)
        End If
    End While
End Function

返回一个列表。如果你必须有一个数组,只需在调用函数时使用ToArray方法

答案 3 :(得分:0)

为什么不使用拆分方法?

Dim s as String = "10,\"Test, t1\",10.1,,,\"123\""
s = s.Replace("\"","")
Dim arr as String[] = s.Split(',')

我的VB生锈了所以请考虑这个伪代码