代码之家  ›  专栏  ›  技术社区  ›  Shpigford

鲁比:我如何处理带有“坏逗号”的csv文件?

  •  1
  • Shpigford  · 技术社区  · 14 年前

    我需要处理fedex.com中包含发货历史记录的csv文件。不幸的是,联邦快递似乎没有真正测试它的csv文件,因为它没有引用包含逗号的字符串。

    例如,公司名称可能是“dog widgets,inc.”,但csv没有引用该字符串,所以任何csv解析器都认为“inc.”前面的逗号是新字段的开头。

    有没有什么方法可以使用Ruby可靠地解析这些行?

    我能找到的唯一区别特征是,作为字符串一部分的逗号在之后有一个空格。分隔字段的逗号没有空格。不知道这有助于我分析这个,但我注意到了。

    4 回复  |  直到 14 年前
        1
  •  1
  •   Jordan Running    14 年前

    好吧,这里有一个想法:您可以用一个唯一的字符替换逗号后跟空格的每个实例,然后像往常一样解析csv,然后遍历结果行并反转替换。

        2
  •  9
  •   ghostdog74    14 年前

    你可以用消极的展望

    >> "foo,bar,baz,pop, blah,foobar".split(/,(?![ \t])/)
    => ["foo", "bar", "baz", "pop, blah", "foobar"]
    
        3
  •  1
  •   Doon    14 年前

    也许是沿着这条线……

    使用gsub将“,”更改为其他内容

    ruby-1.9.2-p0 > "foo,bar,baz,pop, blah,foobar".gsub(/,\ /,'| ').split(',')
    [
        [0] "foo",
        [1] "bar",
        [2] "baz",
        [3] "pop| blah",
        [4] "foobar"
    ]
    

    然后去掉“后”字。

        4
  •  0
  •   BCS    14 年前

    如果您幸运地只有一个这样的字段,那么您可以从一开始就解析前导字段,从后面的字段解析到后面的字段,并假设剩下的是有问题的字段。在python(no habla ruby)中,这看起来像:

    fields = line.split(',') # doesn't work if some fields are quoted
    fields = fields[:5] + [','.join(fields[5:-3])] + fields[-3:]
    

    无论你做什么,你至少应该能够确定冒犯的逗号的数量,这应该给你一些东西(如果没有其他东西的话,做一个健全的检查)。