gpt4 book ai didi

ruby - 我如何 robuSTLy 解析格式错误的 CSV?

转载 作者:数据小太阳 更新时间:2023-10-29 06:37:01 26 4
gpt4 key购买 nike

我正在处理来自政府来源(FEC、州选民数据库等)的数据。它的格式不一致,以各种令人愉快的方式破坏了我的 CSV 解析器。

它是外部来源和权威的。我必须解析它,我不能让它重新输入、在输入时验证等等。就是这样;我不控制输入。

属性:

  1. 字段包含格式错误的 UTF-8(例如 Foo\xAB bar)
  2. 行的第一个字段指定已知集中的记录类型。了解记录类型,您就会知道有多少个字段以及它们各自的数据类型,但直到您知道为止。
  3. 文件中的任何给定行都可以使用带引号的字符串 ("foo",123,"bar") 或不带引号的字符串 (foo,123,bar)。我还没有遇到它在给定行中混合的任何地方(即 "foo",123,bar),但它可能在那里。
  4. 字符串可能包含内部换行符、引号和/或逗号字符。
  5. 字符串可以包含逗号分隔的数字。
  6. 数据文件可能非常大(数百万行),因此这仍然需要相当快。

我正在使用 Ruby FasterCSV(在 1.9 中称为 CSV),但问题应该与语言无关。

我的猜测是,解决方案需要使用明确的记录分隔符/引号字符(例如 ASCII RS、STX)进行预处理替换。我已经开始了一点here但它不适用于我得到的所有东西。

如何稳健地处理这种脏数据?

预计到达时间:这是单个文件中可能包含的内容的简化示例:

"this","is",123,"a","normal","line""line","with "an" internal","quote""short line","withan"internal quote", 1 comma andlinebreaks"un "quot" ed,text,with,1,2,3,numbers"quoted","number","series","1,2,3""invalid \xAB utf-8"

最佳答案

可以将 Ruby 的文件子类化,以便在将 CSV 文件传递​​给 Ruby 的 CSV 解析器之前处理 CSV 文件的每一行。例如,这是我如何使用此技巧将非标准反斜杠转义引号\"替换为标准双引号 ""

class MyFile < File
def gets(*args)
line = super
if line != nil
line.gsub!('\\"','""') # fix the \" that would otherwise cause a parse error
end
line
end
end

infile = MyFile.open(filename)
incsv = CSV.new(infile)

while row = incsv.shift
# process each row here
end

原则上你可以做各种额外的处理,例如UTF-8 清理。这种方法的好处是您可以逐行处理文件,因此您无需将其全部加载到内存中或创建中间文件。

关于ruby - 我如何 robuSTLy 解析格式错误的 CSV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11733076/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com