使用Ruby解析带有转义换行符的CSV文件?

3

如何在Ruby中解析带有转义换行符的CSV文件?在CSV或FasterCSV中没有明显的方法。

以下是一些示例输入:

"foo", "bar"
"rah", "baz \
and stuff"
"green", "red"

在Python中,我会这样做:

csvFile = "foo.csv"
csv.register_dialect('blah', escapechar='\\')
csvReader = csv.reader(open(csvFile), "blah")
2个回答

7
如果包含换行符的字段被正确引用(就像您的示例数据一样),那么Ruby的csv解析器可以很好地处理它们。然而,如果您想让Ruby删除转义字符(就像Python可以通过设置escapechar来做到的那样),那么我在Ruby文档中也没有看到这个方法。(顺便说一句,从Ruby 1.9开始,FasterCSV是Ruby的默认csv实现。)
#!/usr/bin/env ruby -w
require 'csv'

CSV.foreach('test.csv') do |rec|
  puts "Record: #{rec}"
end

输出:

telemachus ~ $ ruby read.rb 
Record: ["foo", "bar"]
Record: ["rah", "baz \\\nand stuff"]
Record: ["green", "red"]

由于我正在使用Ruby 1.9.1,那就是FasterCSV.each。 FasterCSV现在是Ruby中默认的csv实现。 - Telemachus

1

我不是Ruby专家,如果有任何错误请谅解。

你不能用正则表达式来完成这个单步操作(我不知道是否有方法可以实现)。上面的Python代码不是一个正则表达式,所以不要期望使用相同功能的正则表达式来达到目的。

你可以使用Perl兼容的正则表达式,分成两步来完成,但当我尝试在我安装的Ruby版本上运行时,Ruby报错了。一般情况下,你会先读入整个文件,然后使用负回溯断言(split()函数)分割文件,最后再针对每个分割项使用逗号进行分割(split()函数)。

例如:

$allLines=$wholeFile.split(/(?<!\\)\n/m);

但是Ruby抱怨无法识别(?<!)序列。因此,您可能需要采用其他方法。我建议使用专门设计用于解析CSV的库,例如:http://snippets.aktagon.com/snippets/246-How-to-parse-CSV-data-with-Ruby


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接