【问题标题】:Ruby: How can I process a CSV file with "bad commas"?Ruby:如何处理带有“坏逗号”的 CSV 文件?
【发布时间】:2011-04-27 03:49:27
【问题描述】:

我需要处理来自 FedEx.com 的包含运输历史记录的 CSV 文件。不幸的是,FedEx 似乎并没有真正测试其 CSV 文件,因为它没有引用其中包含逗号的字符串。

例如,公司名称可能是“Dog Widgets, Inc.”。但 CSV 没有引用该字符串,因此任何 CSV 解析器都认为逗号位于“Inc.”之前。是一个新领域的开始。

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

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

【问题讨论】:

    标签: ruby parsing csv


    【解决方案1】:

    您可以使用负前瞻

    >> "foo,bar,baz,pop, blah,foobar".split(/,(?![ \t])/)
    => ["foo", "bar", "baz", "pop, blah", "foobar"]
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        也许是这样的..

        使用 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】:

          如果您很幸运只有一个这样的字段,您可以从开头解析前导字段,然后从结尾解析尾随字段,并假设剩下的都是有问题的字段。在 python(没有 habla ruby​​)中,这看起来像:

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

          无论你做什么,你至少应该能够确定有问题的逗号的数量,这应该会给你一些东西(如果没有别的,请进行健全性检查)。

          【讨论】:

            猜你喜欢
            • 2022-06-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-18
            • 2017-09-25
            • 2018-11-26
            • 1970-01-01
            • 2011-09-26
            相关资源
            最近更新 更多