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

Для меня решение отлично работает, если вы имеете дело с большими файлами, с которыми вы могли столкнуться.

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