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

Я пытаюсь проанализировать файл 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

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

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

Ответы [ 7 ]

64 голосов
/ 05 декабря 2011

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

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

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

16 голосов
/ 01 июля 2016

Укажите кодировку с помощью опции encoding:

CSV.foreach(file.path, headers: true, encoding:'iso-8859-1:utf-8') do |row|
  ...
end
12 голосов
/ 22 мая 2013

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

CSV.foreach( "file.csv", "r:windows-1250" ) do |row|
   <your code>
end
0 голосов
/ 22 января 2019

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

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

0 голосов
/ 04 февраля 2015

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

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

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

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

0 голосов
/ 13 мая 2014

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

0 голосов
/ 13 мая 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...