2009-07-09 81 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