Rescue CSV::MalformedCsvError: Недопустимое цитирование в строке n

Кажется, распространенной проблемой является наличие ошибочного CSV-файла при попытке анализа массива, импорта модели AR и т. д. Я не нашел рабочего решения, кроме открытия в MS Excel и save as каждый день (недостаточно хорошо!).

В ежедневно обновляемом CSV-файле из 60 000 строк содержится ошибка: CSV::MalformedCSVError: Illegal quoting in line 95. (в качестве примера). Я рад пропустить/забыть искаженную строку (т.е. она имеет только 1/60000-е значение).

Первая попытка — использовать CSV.foreach или подобное, и просто begin rescue next end, чтобы пропустить ошибку. Нет игральных костей. Я бы хотел, чтобы этот ТАК принятый ответ был немного более подробным: CSV .read Недопустимое цитирование в строке x (т. е. «просто прочтите файл самостоятельно» — кажется, я пробовал это ниже).

И этот SO Q&A (Как я могу дополнительно обработать строку данных, из-за которой библиотека Ruby FasterCSV выдает ошибку MalformedCSVError?) кажется многообещающим, но принятый ответ не... совсем... работает в моем, казалось бы, аналогичный случай (измененный, например, ясность), выполненный через rake task:

file_path = "filename.csv"
my_array = []

File.open(file_path).each do |line| # `foreach` instead of `open..each` does the same
  begin     
    CSV.parse(line) do |row|
      my_array << row
    end
  rescue CSV::MalformedCSVError => er
    puts er.message
    counter += 1
    next
  end
  counter += 1
  puts "#{counter} read success"
end

Выход =>

1 read success
2 read success
...
94 read success
Illegal quoting in line 1 # strange that it says `line 1` vs `95`, which may be the crux of what I do not understand here (e.g. some kind of look ahead error)
96 read success
...
60000 read success 
  # I checked using `line.inspect`, and the 60000th row is indeed being read/inspected
rake aborted!

CSV:MalformedCSVError: Illegal quoting in line 95

person JHFirestarter    schedule 17.05.2016    source источник
comment
примерные строки? было бы здорово иметь 95-ю линию и окружающие.   -  person Ravi Sankar Raju    schedule 17.05.2016
comment
я только что запустил ваш код, и он игнорирует неправильно сформированные строки и помещает все остальное в my_array. Разве это не то, чего ты хочешь?   -  person Ravi Sankar Raju    schedule 17.05.2016
comment
Блин, @littlecegian, я думал, что из-за того, что мой терминал выдавал ошибки, массив не принимает строки (у меня никогда не было сообщений об ошибках, когда спасение работает правильно)! Я только что запустил my_array.count, и в нем было 59999 строк.   -  person JHFirestarter    schedule 17.05.2016
comment
отличный! я просто поставлю это как ответ тогда   -  person Ravi Sankar Raju    schedule 17.05.2016


Ответы (1)


Ваше решение работает. Ожидаемый результат находится в переменной my_array.

person Ravi Sankar Raju    schedule 17.05.2016