Не удается проанализировать файл CSV — «CSV ::MalformedCSVError: поля без кавычек не разрешают r или n»

#ruby-on-rails #ruby #csv #smartercsv

#ruby-on-rails #ruby #csv #smartercsv

Вопрос:

Я пытаюсь проанализировать загруженные CSV-файлы. Вот полное сообщение об ошибке:

 [Worker(host:PC.local pid:69594)] Job ImportJob (id=4) FAILED (3 prior attempts) with CSV::MalformedCSVError: Unquoted fields do not allow r or n (line 1).
  

И файлы CSV выглядят так:

 A1;A2;A3;A4;A5
B1;B2;B3;B4;B5
C1;C2;C3;C4;C5
  

И вот как я перебираю данные в файле CSV:

 data = SmarterCSV.process(
  file,
  {
    :col_sep => ';',
    :chunk_size => 100,
    :remove_empty_values => false,
    :remove_empty_hashes => false
  }
) do |d|
  

В чем проблема? Я пытался поместить заголовок в файл, даже пытался удалить его (версия, опубликованная выше), но в обоих случаях я получаю одну и ту же ошибку. Как мне избавиться от этого?

Комментарии:

1. На какой машине вы работаете (Windows? mac?) был ли файл создан на этом компьютере?

2. Mac. Я создал файл CSV из файла XLS (который, вероятно, был создан в Windows).

3. Я видел нечто подобное с файлом CSV, который был экспортирован из MS Excel. Чтобы исправить это, я, по сути, просто сделал a gsub для замены любых возвратов каретки.

Ответ №1:

Предполагая, что файл CSV был создан в Windows, неудивительно, что окончания строк — » r n». Попробуйте явно указать разделитель строк:

 :row_sep => "r"
  

Собрать все это вместе:

 data = SmarterCSV.process(file, 
  :col_sep => ';', 
  :row_sep => "r", 
  :chunk_size => 100, 
  :remove_empty_values => false, 
  :remove_empty_hashes => false) do |d|
  

Комментарии:

1. К сожалению, все та же ошибка (даже перезапуск приложения не помог).

2. Как насчет создания row_sep rn ?

Ответ №2:

Я столкнулся с этой точной проблемой, но со встроенным модулем CSV.

Я решил это, используя режим чтения ввода-вывода в виде текста: ‘rt’, а не ‘r’:

 require 'csv'

CSV.open(file_name, 'rt').each do |row|
  # blah, blah
end