Кодирование Ruby 1.9 с помощью Excel CSV - PullRequest
3 голосов
/ 19 октября 2011

У меня есть сценарий Ruby, который читает некоторые CSV-файлы, обрабатывает их и записывает (новый) набор CSV-файлов.Я использую Ruby 1.9.2 и новый стандартный гем csv (раньше это был FasterCSV).Исходные CSV-файлы содержат не-ascii символы (é и т. Д.), Но они выходят из Excel, поэтому кодировка не записывается должным образом.В частности, когда я загружаю файл в ruby, я получаю это:

require 'csv'
t = CSV.table('file.csv',:converters=>nil)
t.to_s.encoding
# encoding is ASCII-8BIT

Несмотря на то, что фактическая строка - UTF-8.Моя проблема в том, что я не могу получить эту строку, которая помечена как ASCII для фактического преобразования в UTF-8.Когда я пытаюсь это сделать:

require 'csv'
t = CSV.table('file.csv',:converters=>nil)
f = File.new('output.csv','w:utf-8')
f.write(t.to_s.force_encoding('utf-8'))
f.close

Выходной файл все еще отображается как закодированный в ASCII.Что мне нужно сделать, чтобы получить выходной файл для кодирования в UTF-8?

1 Ответ

2 голосов
/ 09 декабря 2011

Если вы использовали Mac Excel для вывода файлов, они на самом деле будут в кодировке MacRoman, приведенный ниже код может быть не лучшим способом сделать это, но он работает

rows = []
CSV.foreach("../yourfile.csv", col_sep: ",", encoding: "MacRoman") do |row|
  rows << row.map! {|v| v.encode("UTF-8") unless v == nil } 
end

, тогда вы можете конвертироватьв CSV :: Таблица или что-то еще

...