Подтвердить что ты не робот

Импортирование ошибки цитирования CSV приводит меня в орехи

У меня было невероятное время, пытаясь импортировать CSV файл в ruby-1.9.2.

Файл, который я пытаюсь проанализировать, имеет:

  • запятые в столбцах
  • цитаты в столбцах
  • использует '@' как: col_sep

csv.txt(представительский ввод, действительный - 101k строк):

㔾@㔾@jié@"seal" radical in Chinese characters, (Kangxi radical 26)

Мой код:

require 'csv'

CSV.foreach("/Users/adam/Desktop/csvtest.txt", {:col_sep => "@"}) do |row|
    puts row.to_s 
end

Мой желаемый результат:

["㔾", "㔾", "jié", "\"seal\" radical in Chinese characters, (Kangxi radical 26)"]

Что я получаю для вывода:

CSV::MalformedCSVError: Unclosed quoted field on line 1.
from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1910:in `block in shift'
from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1825:in `loop'
from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1825:in `shift'
from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1767:in `each'
from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1202:in `block in foreach'
from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1340:in `open'
from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1201:in `foreach'
from (irb):31
from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/bin/irb:16:in `<main>'

В нем говорится, что есть закрытые цитаты feilds, но я вижу, что кавычки открываются и закрываются.

Выход из кавычек ничего не делает. Я получаю ту же ошибку ([email protected]""seal"" r...). Изменение их на одинарные кавычки заставляет его работать ([email protected]'seal' r...). Проблема в том, что мне нужно, чтобы они были в двойных кавычках.

Любые идеи?

4b9b3361

Ответ 1

Я думаю, что проблема в том, что CSV пытается интерпретировать "seal" как одинарный кавычек; но он не выглядит как @"seal"@, поэтому парсер путается, потому что кавычки должны окружать столбцы. Я не вижу никакой возможности сообщить CSV, что столбцы не цитируются, но вы можете клонировать вокруг нее, установив :quote_char на то, что никогда не произойдет. Если вы используете UTF-8, тогда вы можете безопасно использовать нулевой байт в качестве своего "символа кавычки, который никогда не произойдет":

CSV.foreach(filename, :col_sep => "@", :quote_char => "\x00") do |row|
    #...
end

Это должно работать до тех пор, пока ни один из ваших столбцов не будет указан.