我有一个如下所示的字符串,需要使用VB.NET
拆分为数组10,"测试,t1",10.1 ,,," 123"
结果数组必须有6行,如下所示
10
Test, t1
10.1
(empty)
(empty)
123
所以: 1.必须删除字符串周围的引号 2.逗号可以在字符串内部,并保留在那里(结果数组中的第2行) 3.可以有空字段(源字符串中逗号后面的逗号,中间没有任何内容)
由于
答案 0 :(得分:4)
不要使用String.Split()
:它很慢,并且不会考虑许多可能的边缘情况。
不要使用RegEx。 RegEx可以准确地做到这一点,但为了正确地解释所有情况,表达式往往非常复杂,难以维护,并且此时并不比.Split()
选项快得多。 / p>
使用专用的CSV解析器。选项包括Microsoft.VisualBasic.TextFieldParser类型,FastCSV,linq-to-csv和parser 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生锈了所以请考虑这个伪代码