Разобрать искаженную линию CSV - PullRequest
0 голосов
/ 23 августа 2011

Я анализирую следующие строки CSV.Мне нужно спасти искаженные линии, которые выглядят как "Malformed" ниже.Какое регулярное выражение я могу использовать для этого?Какие соображения мне нужно сделать?

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

Ответы [ 2 ]

2 голосов
/ 23 августа 2011

Я не уверен, насколько искажены ваши данные, но вот один подход к этой строке.

> 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"
""
""

Примечание : проверено на ruby ​​1.9.2p290

0 голосов
/ 30 января 2013

Вы можете использовать регулярное выражение для замены вложенных двойных кавычек одинарными, прежде чем они будут переданы в синтаксический анализатор.

Что-то вроде

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