Regex csv解析中的正则表达式作弊以逗号分隔,在引号中忽略
全部 所以,我试图找出如何为VisualBasic.net生成一个简单的正则表达式代码,但没有任何进展 我正在将csv文件解析到一个数组列表中,但源csv不是原始的。在足够的地方有额外的/恶意的引号,足以使程序崩溃,并且有足够多的引号使手动修复数据变得麻烦 我写了一系列的错误检查,它在99.99%的时间里有效。但是,由于每个文件夹需要解析10000行,所以平均每套csv文件都会出现一个错误。崩溃为了正确解析最后的0.01%,我创建了一个If语句,该语句将拉出带有奇数引号的行,并删除所有这些行,如果没有引号,则会触发手动错误检查,字段将照常处理。如果有偶数个引号,则标准拆分函数不能忽略没有正则表达式的引号之间的分隔符 有人能帮我找出一个正则表达式字符串,它将忽略引号中的字段吗?Regex csv解析中的正则表达式作弊以逗号分隔,在引号中忽略,regex,vb.net,Regex,Vb.net,全部 所以,我试图找出如何为VisualBasic.net生成一个简单的正则表达式代码,但没有任何进展 我正在将csv文件解析到一个数组列表中,但源csv不是原始的。在足够的地方有额外的/恶意的引号,足以使程序崩溃,并且有足够多的引号使手动修复数据变得麻烦 我写了一系列的错误检查,它在99.99%的时间里有效。但是,由于每个文件夹需要解析10000行,所以平均每套csv文件都会出现一个错误。崩溃为了正确解析最后的0.01%,我创建了一个If语句,该语句将拉出带有奇数引号的行,并删除所有这些行,如
这是到目前为止我所能想到的代码 先谢谢你
Using filereader1 As New Microsoft.VisualBasic.FileIO.TextFieldParser(files_(i),
System.Text.Encoding.Default) 'system text decoding adds odd characters
filereader1.TextFieldType = FieldType.Delimited
'filereader1.Delimiters = New String() {","}
filereader1.SetDelimiters(",")
filereader1.HasFieldsEnclosedInQuotes = True
For Each c As Char In whole_string
If c = """" Then cnt = cnt + 1
Next
If cnt = 0 Then 'no quotes
split_string = Split(whole_string, ",") 'split by commas
ElseIf cnt Mod 2 = 0 Then 'even number of quotes
split_string = Regex.Split(whole_string, "(?=(([^""]|.)*""([^""]|.)*"")*([^""]|.)*$)")
ElseIf cnt <> 0 Then 'odd number of quotes
whole_string = whole_string.Replace("""", " ") 'delete all quotes
split_string = Split(whole_string, ",") 'split by commas
End If
使用filereader1作为新的Microsoft.VisualBasic.FileIO.TextFieldParser(文件(i)),
System.Text.Encoding.Default)“系统文本解码会添加奇数字符
filereader1.TextFieldType=FieldType.Delimited
'filereader1.Delimiters=新字符串(){,“}
filereader1.SetDelimiters(“,”)
filereader1.HasFieldsEnclosedInQuotes=True
对于整个字符串中的每个c作为字符
如果c=“”,则cnt=cnt+1
下一个
如果cnt=0,则“无引号”
拆分字符串=拆分(整个字符串,“,”)以逗号拆分
ElseIf cnt Mod 2=0,则为偶数引号
split_string=Regex.split(整个_string,“(?=([^”“]|])*”([^”“]|])*“)*([^”“]|])*”)
ElseIf cnt 0然后是奇数引号
整字符串=整字符串。替换(“”,“”)删除所有引号
拆分字符串=拆分(整个字符串,“,”)以逗号拆分
如果结束
在VB.NET中,有几种方法可以继续
选项1
您可以使用此正则表达式:,(?![^“,]*”
它与不在引号内的逗号相匹配:逗号,
后面是而不是,(由负前瞻(?![^“,]*”)
)的字符,这些字符既不是逗号也不是引号,然后是引号
在VB.NET中,类似于:
Dim MyRegex As New Regex(",(?![^"",]*"")")
ResultString = MyRegex.Replace(Subject, "|")
选项2
这使用了这个非常简单的正则表达式:“[^”]*”|(,)
这是一个更一般的解决方案,也更容易调整。为了完整的描述,我建议你看看关于的这个问题。如果你发现其他情况需要调整,它可以成为一个非常整洁的解决方案,很容易维护
替换的左侧与complete“quotes”
匹配。我们将忽略这些匹配。右侧匹配并捕获逗号到组1,我们知道它们是右侧的,因为它们与左侧的表达式不匹配
此代码应适用于:
Imports System
Imports System.Text.RegularExpressions
Imports System.Collections.Specialized
Module Module1
Sub Main()
Dim MyRegex As New Regex("""[^""]*""|(,)")
Dim Subject As String = "LIST,410210,2-4,""PUMP, HYDRAULIC PISTON - MAIN"",1,,,"
Dim Replaced As String = myRegex.Replace(Subject,
Function(m As Match)
If (m.Groups(1).Value = "") Then
Return ""
Else
Return m.Groups(0).Value
End If
End Function)
Console.WriteLine(Replaced)
Console.WriteLine(vbCrLf & "Press Any Key to Exit.")
Console.ReadKey()
End Sub
End Module
参考
如果你想让我看到你的消息,如果你想让我看到你的消息,用
@zx81
回复。如果你想让我看到你的消息,用@zx81
请请给我们一个具体的例子,你想给我们一个具体的例子,你想给我们一个你想忽略什么的具体的例子,以及在什么上下文(在一行,等)如果你想让我看到你想让我看到你的消息,回复你的回复@zx81在前面。请请请请请请请我们我们我们给我们提供一个具体的例子。请请请给我们一个具体的我们请请给我们给我们一个具体的例子。请请给我们一个具体的具体的例子。请给我们请给我们请给我们一个具体的例子,请请泵,液压活塞-主1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U UUuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu当前输出线(在管道处分隔)|uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu列表| 410210 | 2-4 |“泵|液压活塞-主泵”| 1 | | |感谢您的澄清。发布了两个选项,让我知道它们是如何工作的。:)