Разбор CSV для Ruby/Rails, неверная последовательность байтов в UTF-8

Я пытаюсь проанализировать файл CSV, созданный из электронной таблицы Excel.

Вот мой код

require 'csv'
file = File.open("input_file")
csv = CSV.parse(file)

Но я получаю эту ошибку

ArgumentError: invalid byte sequence in UTF-8

Я думаю, что ошибка в том, что Excel кодирует файл в ISO 8859-1 (Latin-1) и не в UTF-8

Может кто-нибудь помочь мне с обходом этой проблемы, пожалуйста

Заранее спасибо.

6 ответов

Решение

Вы должны сказать Ruby, что файл находится в ISO-8859-1. Измените вашу открытую строку файла на это:

file=File.open("input_file", "r:ISO-8859-1")

Второй аргумент указывает Ruby открывать только для чтения с кодировкой ISO-8859-1.

Укажите кодировку с encoding опция:

CSV.foreach(file.path, headers: true, encoding:'iso-8859-1:utf-8') do |row|
  ...
end

Вы можете указать исходную кодировку прямо в параметре режима файла:

CSV.foreach( "file.csv", "r:windows-1250" ) do |row|
   <your code>
end

Если у вас есть только один (или несколько) файл, поэтому, когда нет необходимости автоматически объявлять кодировку для любого файла, который вы получаете из ввода, и у вас есть содержимое этого файла, видимое в виде открытого текста (txt, csv и т. Д.), Разделенное, например, точкой с запятой, Вы можете создать новый файл с .csv вручную и вставьте туда содержимое вашего файла, затем проанализируйте содержимое как обычно.

Имейте в виду, что это обходной путь, но при необходимости синтаксического анализа в linux только одного большого файла Excel, преобразованного в некую разновидность CSV, он экономит время на экспериментах со всеми этими причудливыми кодировками.

Добавить второй аргумент "r:ISO-8859-1" как File.open("input_file","r:ISO-8859-1" )

У меня была такая же проблема, и я просто использовал таблицы Google, а затем загружал их в формате CSV. Это было самое простое решение.

Тогда я наткнулся на этот драгоценный камень

https://github.com/singlebrook/utf8-cleaner

Теперь мне не нужно беспокоиться об этой проблеме вообще. Надеюсь это поможет!

Сохраните файл в utf-8, если по какой-то причине вам не нужно сохранять его иначе, в этом случае вы можете указать закодированный набор при чтении файла

Другие вопросы по тегам