Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex csv解析中的正则表达式作弊以逗号分隔,在引号中忽略_Regex_Vb.net - Fatal编程技术网

Regex csv解析中的正则表达式作弊以逗号分隔,在引号中忽略

Regex csv解析中的正则表达式作弊以逗号分隔,在引号中忽略,regex,vb.net,Regex,Vb.net,全部 所以,我试图找出如何为VisualBasic.net生成一个简单的正则表达式代码,但没有任何进展 我正在将csv文件解析到一个数组列表中,但源csv不是原始的。在足够的地方有额外的/恶意的引号,足以使程序崩溃,并且有足够多的引号使手动修复数据变得麻烦 我写了一系列的错误检查,它在99.99%的时间里有效。但是,由于每个文件夹需要解析10000行,所以平均每套csv文件都会出现一个错误。崩溃为了正确解析最后的0.01%,我创建了一个If语句,该语句将拉出带有奇数引号的行,并删除所有这些行,如

全部 所以,我试图找出如何为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 | | |感谢您的澄清。发布了两个选项,让我知道它们是如何工作的。:)