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")
4

2 回答 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"]
于 2009-07-10T00:00:51.267 回答
1

我不是 Ruby 专家,所以请原谅这些方面的任何错误。

您不能使用正则表达式(我知道)一步完成。上面的 Python 代码不是正则表达式,所以不要期望使用做同样事情的正则表达式。

您可以使用 Perl 兼容的正则表达式分两步完成,但是当我在已安装的 Ruby 版本上尝试它时,Ruby 抱怨道。您通常会读入整个文件,然后使用否定的lookbehind拆分()文件,然后拆分()从a上返回的每个元素。

例如:

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

但是 Ruby 抱怨 (?<! 序列无法识别。所以你可能不得不求助于其他方法。我会推荐一个专门为解析 CSV 设计的库,例如:http://snippets.aktagon .com/snippets/246-How-to-parse-CSV-data-with-Ruby

于 2009-07-09T20:29:08.057 回答