2011-08-22 98 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(/(?<!^|,)"(?!,|$)/,"'")