#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