Разбор 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, если по какой-то причине вам не нужно сохранять его иначе, в этом случае вы можете указать закодированный набор при чтении файла