разобрать CSV с запятыми, двойными кавычками и кодировкой - PullRequest
5 голосов
/ 22 декабря 2011

Я использую ruby ​​1.9 для анализа следующего CSV-файла с MacRoman символ

# encoding: ISO-8859-1
#csv_parse.csv
Name, main-dialogue
"Marceu", "Give it to him ó he, his wife."

Я сделал следующее, чтобы разобрать это.

require 'csv'
input_string = File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")
 #=> "Name, main-dialogue\r\n\"Marceu\", \"Give it to him  \x97 he, his wife.\"\r\n"

data = CSV.parse(input_string, :quote_char => "'", :col_sep => "/\",/")
 #=> [["Name, main-dialogue"], ["\"Marceu", " \"Give it to him  \x97 he, his wife.\""]]

Итак, проблема заключается в том, что второй массив данных состоит из одной строки, а не из двух строк, например: ["\"Marceu\"", " \"Give it to him \x97 he, his wife.\""]] Я пытался с :col_sep => "," (это поведение по умолчанию), но это дало мне 3 разделения.

header = CSV.parse(input_string, :quote_char => "'")[0].map{|a| a.strip.downcase unless a.nil? }
 #=> ["Name", "main-dialogue"]

Я должен снова проанализировать заголовок, поскольку здесь нет двойной кавычки.

Вывод предполагается снова отобразить в браузере, поэтому символ ó должен отображаться как обычно, а не как \x97 или другой.

Есть ли способ решить вышеуказанные проблемы?

Ответы [ 2 ]

8 голосов
/ 23 декабря 2011

Я думаю, у вас есть MacRoman закодированные данные;если вы сделаете это в irb:

>> "\x97".force_encoding('MacRoman').encode('UTF-8')

, вы получите:

=> "ó"

И это тот персонаж, которого вы ожидаете.Итак, вы хотите это:

input_string = File.read("../csv_parse.rb").force_encoding('MacRoman').encode('UTF-8')

Тогда у вас есть два столбца в CSV, столбцы заключены в двойные кавычки (поэтому вам не нужно :quote_char), а разделитель равен ', 'это должно работать:

data = CSV.parse(input_string, :col_sep => ", ")

и data будет выглядеть так:

[
    ["Name", "main-dialogue"],
    ["Marceu", "Give it to him  ó he, his wife."]
]
0 голосов
/ 22 декабря 2011

Мне кажется, что вы неправильно используете опции :quote_char и :col_sep.

Первый должен быть тем символом, который используется для включения полей, то есть '"' для данных, которые выпоказано, и :col_sep должно быть просто ","

Двойные кавычки, показанные в вашем последнем примере, - это просто форматирование ruby ​​для вас.

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