2011-08-22 101 views
0

我解析了以下CSV行。我需要拯救下面看起來像"Malformed"的格式不正確的行。什麼是我可以用來做這個的正則表達式?我需要做什麼考慮?解析格式不正確的CSV行

body = %(
"Sensitive",2416,159,"Test "Malformed" Failure",2789,111,7-24-11,1800,0600,"R2","12323","","" 
"Sensitive",2742,107,"Test",2791,112,7-24-11,1800,0600,"R1","","","" 
"Sensitive",2700,135,"Test",2792,113,7-24-11,1800,0600,"R1","12110","","") 

rows = [] 
body.each_line do |line| 
    begin 
    rows << FasterCSV.parse_line(line) 
    rescue FasterCSV::MalformedCSVError => e 
    rows << line if rescue_from_malformed_line(line) 
    rescue => e 
    Rails.logger.error(e.to_s) 
    Rails.logger.info(line) 
    end 
end 
+0

你想採取與那樣的線什麼行動?我會建議分割,並刪除引號,然後重新構建正確的csv並在下一行重新開始。 –

+0

我想在ararys的數組中包含雙引號。 – maletor

+0

錯誤引用的文本是否包含逗號?爲什麼不在將CSV文件提交給應用程序之前將其脫機處理,而不是每次必須讀取時都要修復它? –

回答

2

我不確定您的數據有多麼畸形,但這裏有一條針對該線的方法。

> puts line 
"Sensitive",2416,159,"Test "Malformed" Failure",2789,111,7-24-11,1800,0600,"R2","12323","","" 
> 
> puts line.scan /[\d.-]+|(?:"[^"]*"[^",]*)+/ 
"Sensitive" 
2416 
159 
"Test "Malformed" Failure" 
2789 
111 
7-24-11 
1800 
0600 
"R2" 
"12323" 
"" 
"" 

注意:在測試了紅寶石1.9.2p290

+0

嘿,這也分裂了日期,嘗試使用'line.split','' –

+0

@Devin,我沒有意識到有日期,固定。非常感謝。 – YOU

+0

Np,只是偶然注意到它。 –

0

你可以使用正則表達式之前它傳遞給解析器來代替單引號嵌套雙引號。

喜歡的東西

.gsub(/(?<!^|,)"(?!,|$)/,"'")