我有一个如下的字符串,需要使用 VB.NET 将其拆分为数组
10,"测试, t1",10.1,,,"123"
结果数组必须有 6 行,如下所示
10
Test, t1
10.1
(empty)
(empty)
123
所以: 1. 必须删除字符串周围的引号 2. 逗号可以在字符串内,并将保留在那里(结果数组中的第 2 行) 3. 可以有空字段(源字符串中逗号后的逗号,中间没有任何内容)
谢谢
不要使用String.Split()
: 它很慢,并且没有考虑到许多可能的边缘情况。
不要使用正则表达式。RegEx 可以精确地做到这一点,但要正确解释所有情况,表达式往往非常复杂,难以维护,并且在这一点上并不比.Split()
选项快多少。
请使用专用的 CSV 解析器。选项包括Microsoft.VisualBasic.TextFieldParser类型、FastCSV、linq-to-csv和我为另一个答案编写的解析器。
这是另一种按分隔符而不是按字符循环的简单方法:
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 方法
你可以自己写一个函数。这应该可以解决问题:
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
为什么不直接使用 split 方法?
Dim s as String = "10,\"Test, t1\",10.1,,,\"123\""
s = s.Replace("\"","")
Dim arr as String[] = s.Split(',')
我的 VB 生锈了,所以考虑一下这个伪代码