在字符串中替换逗号,但仅在VB.net中的特定位置

在字符串中替换逗号,但仅在VB.net中的特定位置

问题描述:

我正在读取VB.net中的csv文件并将行保存到SQL数据库。在我的代码稍后的一段时间,应用程序中会回顾SQL行,并使用Split函数来获取“字段”值。分割完成后,逗号作为分隔符。在字符串中替换逗号,但仅在VB.net中的特定位置

该应用程序处理许多其他文件(包括excel),并且split函数用于所有这些文件。

我现在面临的问题是我读取的一个csv文件的字段值以“后跟多个值,以逗号分隔并以另一个字符结尾”开头。正常读取csv文件会导致这些单个字段值中的每一个都被视为单独的值。希望我有道理?

一个例子行是:

Elker,MissB,"Bus, Taxi, Train, Ferry, Parking, Toll",800253 

那里应该只被分离以4列,它们就分开,以9列来代替。

我想要做的是在'Bus'之后替换逗号,直到'Toll'为'?'代替。

我已经尝试过使用Replace,包括重载的起始位置,但它最终会用'?'替换行中的所有逗号。

尝试1: '?'

If vstrLine(intStartPos) = "," Then 
    strRetVal = Replace(vstrLine(intStartPos), ",", "?") 
end if 

其中vstrLineElker,MissB,"Bus, Taxi, Train, Ferry, Parking, Toll",800253intStartPos是一个逗号的“

后的第一个实例仅返回而不是将1个逗号替换为'?'的字符串

尝试2:

If vstrLine(intStartPos) = "," Then 
    strRetVal = Replace(vstrLine, ",", "?", intStartPos) 
end if 

它返回与全部换成逗号字符串 '?'

+0

使用http://www.filehelpers.com/default.html。它是免费的,并处理这一点。这里有很多例子!另外,CSV中的引号是表示文本的一种方式,FileHelpers会处理这一点。 – dash

可以使用匹配任一引用的值或不含有逗号的值的正则表达式

例:

Dim input As String = "Elker,MissB,""Bus, Taxi, Train, Ferry, Parking, Toll"",800253" 
Dim values As MatchCollection = Regex.Matches(input, "("".*""|[^,]+)") 

For Each value As Match In values 
    Console.WriteLine(value.Value) 
Next 

输出:

Elker 
MissB 
"Bus, Taxi, Train, Ferry, Parking, Toll" 
800253 
+0

这是一个非常优秀的解决方案。 – UnhandledExcepSean

为什么重新发明*?除非你想做一些非常自定义的东西,否则使用一个已经制作好的CSV阅读器。我推荐this one

使用VB中内置的TextFieldParser类。它可以处理读取csv文件,并能正确处理字段中的逗号。

http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.aspx