【问题标题】:Regex cheating in csv-parsing delimited at comma, ignore in quotescsv解析中的正则表达式作弊以逗号分隔,引号中忽略
【发布时间】:2014-06-17 21:39:12
【问题描述】:

全部 所以,我试图弄清楚如何为 Visual Basic.net 制作一个简单的正则表达式代码,但我一无所获。

我正在将 csv 文件解析为数组列表,但源 csv 绝不是原始文件。在足够多的地方有多余的/流氓引号会使程序崩溃,并且有足够多的引号使手动修复数据变得很麻烦。

我写了一堆错误检查,它在大约 99.99% 的时间里都有效。但是,每个文件夹要解析 10,000 行,这意味着每组 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

【问题讨论】:

  • 请给我们一个具体的例子,说明您要忽略的内容,以及在什么情况下(在一行中等)如果您希望我看到您的消息,请在前面回复@zx81 .
  • @zx81
    输入线 ___________________________________________________________ LIST,410210,2-4,"PUMP, HYDRAULIC PISTON - MAIN",1,,, _________________ ______________________________________________________ 所需的输出线(在管道处分隔) _________________________ LIST| 410210|2-4|“泵,液压活塞 - 主”|1||| ______________ ________________________________________________________ 电流输出线(在管道处分隔) _____________________________ LIST|410210|2-4|“泵| 液压活塞 - 主”|1|||
  • 感谢您的澄清。发布了两个选项,让我知道它们是如何工作的。 :)

标签: regex vb.net


【解决方案1】:

在 VB.NET 中,有几种方法可以继续。

选项 1

你可以使用这个正则表达式:,(?![^",]*")

它匹配不在引号内的逗号:not 的逗号, 后跟(由否定前瞻(?![^",]*") 断言)后跟既不是逗号也不是引号的字符引用。

在 VB.NET 中,类似于:

Dim MyRegex As New Regex(",(?![^"",]*"")")
ResultString = MyRegex.Replace(Subject, "|")

选项 2

这使用了这个漂亮简单的正则表达式:"[^"]*"|(,)

这是一个更通用且易于调整的解决方案。有关完整的描述,我建议您查看Regex-matching or replacing... except when... 的这个问题。如果您发现其他需要调整的情况,它可以制作一个非常整洁的解决方案,并且易于维护。

交替的左侧| 匹配完整的"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

参考

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 2017-11-25
    • 2014-02-26
    相关资源
    最近更新 更多