2009-07-09 62 views
3

如何使用Ruby中的转义换行符解析CSV文件?我在CSV或FasterCSV中看不到任何明显的内容。用Ruby中的转义换行符解析CSV文件?

下面是一些例子输入:

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

在Python中,我这样做:

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

回答

1

我不是红宝石的专家,所以请原谅沿着这些线路的任何错误。

你不能用一个正则表达式(我知道的)在一个步骤中做到这一点。上面的Python代码不是正则表达式,所以不要指望使用正则表达式来执行相同的操作。

你可以用Perl兼容的正则表达式在两个步骤中完成它,但是当我在安装的Ruby版本上试过时,Ruby抱怨道。您通常会读入整个文件,然后使用负面倒序分割()文件,然后split()从a,中返回的每个元素。

例如:

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

但是Ruby抱怨说,(<序列无法识别所以你可能将不得不诉诸其他一些方法,我特别推荐一个图书馆吗?!。设计用于解析CSV例如:http://snippets.aktagon.com/snippets/246-How-to-parse-CSV-data-with-Ruby

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"] 
+0

+1。同样适用于FasterCSV.each。 – Swanand 2009-07-10 08:34:44