0

我有一个如下的字符串,需要使用 VB.NET 将其拆分为数组

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

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

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

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

谢谢

4

4 回答 4

4

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

不要使用正则表达式。RegEx 可以精确地做到这一点,但要正确解释所有情况,表达式往往非常复杂,难以维护,并且在这一点上并不比.Split()选项快多少。

请使用专用的 CSV 解析器。选项包括Microsoft.VisualBasic.TextFieldParser类型、FastCSVlinq-to-csv和我为另一个答案编写的解析器。

于 2013-06-24T22:16:08.967 回答
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 方法

于 2013-06-26T08:50:32.080 回答
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
于 2013-06-24T22:29:40.967 回答
0

为什么不直接使用 split 方法?

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

我的 VB 生锈了,所以考虑一下这个伪代码

于 2013-06-24T22:15:29.910 回答