如何在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")
如何在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")
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专家,如果有任何错误请谅解。
你不能用正则表达式来完成这个单步操作(我不知道是否有方法可以实现)。上面的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