解析格式不正确的CSV行
问题描述:
我解析了以下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
答
我不确定您的数据有多么畸形,但这里有一条针对该线的方法。
> 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
答
你可以使用正则表达式之前它传递给解析器来代替单引号嵌套双引号。
喜欢的东西
.gsub(/(?<!^|,)"(?!,|$)/,"'")
你想采取与那样的线什么行动?我会建议分割,并删除引号,然后重新构建正确的csv并在下一行重新开始。 –
我想在ararys的数组中包含双引号。 – maletor
错误引用的文本是否包含逗号?为什么不在将CSV文件提交给应用程序之前将其脱机处理,而不是每次必须读取时都要修复它? –