使用Ruby中的转义换行解析CSV文件?

时间:2009-07-09 19:06:32

标签: ruby csv parsing newline

如何解析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 个答案:

答案 0 :(得分: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"]

答案 1 :(得分:1)

我不是Ruby专家,所以请原谅任何错误。

你不能用正则表达式(我知道)一步完成。上面的Python代码不是正则表达式,所以不要期望使用执行相同操作的正则表达式。

你可以使用Perl compatable regex分两步完成它,但是当我在已安装的Ruby版本上尝试它时,Ruby抱怨道。您通常会读取整个文件,然后使用负向lookbehind split()文件,然后split()从a上返回的每个元素。

例如:

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

但Ruby抱怨(?&lt;!序列无法识别。所以你可能不得不求助于其他方法。我建议专门设计用于解析CSV的库,例如:{{3 }}