2010-02-19 20 views
2

我在這竟然放棄了我的CSV文件以下行的問題在解析時:使用FasterCSV解析此行的正確方法?

312,'997639',' 2','John, Doe. "J.D." ',' ','2000 ',' ','Street ','City ','NY','99999','','2010-02-17 19:12:04','2010-02-17 19:12:04';

我用下面的參數解析:

FasterCSV.foreach(file, {:headers => true, :quote_char => '"', :col_sep => "','"}) do |row| 

然而,對行炸燬就像上面那個由於行列中的「JD」一樣。我如何正確解析這一行與FasterCSV?

謝謝!

回答

0

我一直無法彎曲FasterCSV上班這種方式我需要它與這個數據,所以最終的結果只需要一個新的數據轉儲與正確的CSV輸出。感謝您的嘗試!

3

它在我看來像你的:quote_char應該是':col_sep應該是,。在這種情況下:

FasterCSV.foreach(file, {:headers => true, :quote_char => "'", :col_sep => ','}) ... 
+0

導致FasterCSV :: MalformedCSVError(FasterCSV :: MalformedCSVError) 異常拋出。 – mwilliams 2010-02-19 00:53:32

+1

您的CSV如何生成?你確定它是完好的嗎? :quote_char指定環繞字段的字符,在您的示例中看起來像是單引號,並且:col_sep指定字段之間的字符,在您的示例中它似乎是逗號。這是我根據我的回答得到的信息。 – 2010-02-19 01:00:01

+0

問題是它沒有形成良好,我試圖彎曲FasterCSV來解析它。轉儲來自客戶,我已經發送了適當的SQL查詢來輸出正確的CSV。與此同時,我仍然試圖破解它。 – mwilliams 2010-02-19 01:06:22

1

你不能那樣做。 FasterCSV只允許選擇一個引用字符,而您的應用程序需要兩個。沒有辦法做可愛的東西一樣傳遞一個正則表達式,而不是一個字符,因爲FasterCSV預編譯的匹配與引號字符轉義如下:

# prebuild Regexps for faster parsing 
esc_col_sep = Regexp.escape(@col_sep) 
esc_row_sep = Regexp.escape(@row_sep) 
esc_quote = Regexp.escape(@quote_char) 
@parsers = { 
    :any_field  => Regexp.new("[^#{esc_col_sep}]+", 
           Regexp::MULTILINE, 
           @encoding), 
    :quoted_field => Regexp.new("^#{esc_quote}(.*)#{esc_quote}$", 
           Regexp::MULTILINE, 
           @encoding), 
    ... 
}