CSV - Неотображаемые поля не позволяют \r или\n (строка 2)
Попытка разобрать CSV файл, но все равно получение сообщения об ошибке Некотируемые поля не позволяют \r или\n (строка 2)..
Я нашел здесь в SO подобную тему, где был намек на следующее:
CSV.open('file.csv', :row_sep => "\r\n") do |csv|
но его, к сожалению, не работает... Я не могу изменить файл CSV, поэтому мне нужно будет исправить его в коде.
ИЗМЕНИТЬ образец файла CSV:
A;B;C
1234;...
Есть ли способ сделать это?
Большое спасибо!
Ответы
Ответ 1
Прежде всего, вы должны установить разделители столбцов на ';', так как это не обычный способ обработки файлов CSV. Это сработало для меня:
CSV.open('file.csv', :row_sep => :auto, :col_sep => ";") do |csv|
csv.each { |a,b,c| puts "#{a},#{b},#{c}" }
end
Из документации 1.9.2 CSV:
Автоматическое обнаружение считывает данные в поисках следующего \r\n
, \n
или \r
. Последовательность будет выбрана, даже если это произойдет в цитируемом поле, предполагая, что у вас будут одинаковые окончания строк есть.
Ответ 2
Упрощенное решение, если CSV был затронут или сохранен любой программой, которая, возможно, использовала странное форматирование (например, Excel или Таблицу):
- Откройте файл с любым текстовым редактором plain (я использовал Sublime Text 3)
- Нажмите клавишу ввода, чтобы добавить новую строку в любом месте
- Сохранить файл
- Удалите только что добавленную строку.
- Сохранить файл снова
- Повторите попытку импорта, ошибка должна исчезнуть.
Ответ 3
Для меня я импортировал CSV LinkedIn и получил ошибку.
Я удалил пустые строки следующим образом:
def import
csv_text = File.read('filepath', :encoding => 'ISO-8859-1')
#remove blank lines from LinkedIn
csv_text = csv_text.gsub /^$\n/, ''
@csv = CSV.parse(csv_text, :headers => true, skip_blanks: true)
end
Ответ 4
В моем случае мне пришлось предоставить кодировку и цитату char, которая, как гарантировалось, не произошла в данных
CSV.read("file.txt", 'rb:bom|UTF-16LE', {:row_sep => "\r\n", :col_sep => "\t", :quote_char => "\x00"})
Ответ 5
Другим простым решением для исправления странного форматирования, вызванного Excel, является копирование и вставка данных в электронную таблицу Google, а затем их загрузку в виде CSV.
Ответ 6
В моем случае первая строка таблицы /CSV была двузначным битом текста введения. Я получил ошибку:
/Users/.../.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/csv.rb:1880: в блоке (2 уровня) в смену ': неупомянутые поля не позволяют \r или\n (строка 1). (CSV:: MalformedCSVError)
Я удалил комментарий с символами, поэтому .csv ТОЛЬКО имел данные .csv, сохранил его, а моя программа работала без ошибок.
Ответ 7
Если вам нужно иметь дело с файлами, поступающими из Excel с новыми символами в ячейках, также есть решение.
Большим недостатком этого способа является то, что не допускаются никакие точки с запятой или никакие двойные кавычки в строках.
Я предпочитаю идти без точек с запятой
if file.respond_to?(:read)
csv_contents = file.read
elsif file_data.respond_to?(:path)
csv_contents = File.read(file.path)
else
logger.error "Bad file_data: #{file_data.class.name}: #{file_data.inspect}"
return false
end
result = "string"
csv_contents = csv_contents.force_encoding("iso-8859-1").encode('utf-8') # In my case the files are latin 1...
# Here is the important part (Remove all newlines between quotes):
while !result.nil?
result = csv_contents.sub!(/(\"[^\;]*)[\n\r]([^\;]*\")/){$1 + ", " + $2}
end
CSV.parse(csv_contents, headers: false, :row_sep => :auto, col_sep: ";") do |row|
# do whatever
end
Для меня решение отлично работает, если вы имеете дело с большими файлами, с которыми вы могли столкнуться.
Если вы хотите использовать без кавычек, просто замените точки с запятой в регулярном выражении кавычками.