Обработка CSV с 1.9.2 - при использовании хэша опций возвращаются несколько строк в виде одного массива - PullRequest
2 голосов
/ 29 марта 2011

Мы только начали использовать Ruby 1.9.2, поэтому теперь мы используем CSV, а не FasterCSV (ну, мы все еще используем FasterCSV, но вы понимаете, о чем я).

Я не могу получить код в примере 2 ниже, чтобы игнорировать строку заголовка с помощью параметров. Когда я добавляю ЛЮБЫЕ параметры в CSV.foreach, он объединяет весь CSV-файл и все его строки в один массив, а не массив в каждой строке. Рабочий пример ниже:

Следующий код прекрасно работает для меня (в обоих случаях я использую один и тот же файл:

CSV.foreach(csv_import.path) do |row_data|
    puts row_data.inspect
end

Результат:

["a", "b", "c", "d", "e", "f", "g", "h"]
["1", "1", "1", "1", "1", "1", "1", "1"]
["2", "2", "2", "2", "2", "2", "2", "2"]

ИДЕАЛЬНОЕ! это то, что я хочу, за исключением того, что я хочу игнорировать ["a", "b", "c", "d", "e", "f", "g", "h"]

Так что теперь я пишу код:

CSV.foreach(csv_import.path, :headers => true) do |row_data|
   puts row_data.inspect
end

Результат - 1 строка:

["a", "b", "c", "d", "e", "f", "g", "h \ n1", "1", "1", "1", «1», «1», «1», «1 \ n2», «2», «2», «2», «2», «2», «2», «2»]

Я уверен, что я что-то набил в опциях Hash, но я не знаю, что это? Я пробовал строковые значения, строковые ключи, упаковывая параметры с {}, но безрезультатно. Я пробовал также row_sep = "\ n".

Я новичок в RoR, кто-нибудь может пролить свет на то, какую ошибку я здесь делаю?


Спасибо за ответ, Зигги, но мне не повезло. Похоже, CSV.foreach возвращается и Array для меня? Будет ли JRuby влиять:

Это моя версия

jruby 1.6.0 (уровень исправления ruby ​​1.9.2 136) (2011-03-15 f3b6154) (Java HotSpot (TM) 6 4-разрядная серверная виртуальная машина 1.6.0_24) [Windows 7-amd64-java]

Я попробовал ваш код и получил следующее:

CSV.foreach(csv_import.path) do |row_data|
  puts row_data.class
  puts row_data.length
end

выход:

Массив 8 массив 8 массив 8

CSV.foreach(csv_import.path, :headers => :first_row, :return_headers => false) do |row_data|
  puts row_data.class
  puts row_data.length
end

выход:

Массив 22

Я знаю, что это простой обходной путь, позволяющий игнорировать заголовки программно, просто хотел узнать, правильно ли я использовал библиотеку.

Ответы [ 2 ]

4 голосов
/ 29 марта 2011

Я думаю, вам нужно использовать :return_headers вместо :headers.В соответствии с RDOC CSV :headers => true сделает первую строку из набора данных заголовком.Поэтому вы можете сначала указать, что первая строка - это заголовок и что вы хотите пропустить заголовок.Правильный вариант вашего примера должен выглядеть следующим образом:

CSV.foreach('test.csv', :headers => :first_row, :return_headers => false) do |row_data|
   puts row_data.to_s
end

Каждый объект row_data является объектом CSV :: Row.Поскольку я не знал, какой формат вам нужен, я использовал to_s в качестве примера.

Вот содержимое моего файла 'test.csv': a, b, c, d, e,f, g, h 1,1,1,1,1,1,1,1 2,2,2,2,2,2,2,2

И если я сделаю это

CSV.foreach('test.csv', :headers => :first_row, :return_headers => false) do |row_data|
    puts row_data.class
    puts row_data.length
end

Я получу

CSV::Row
8
CSV::Row
8

PS Я также использую require 'csv' перед кодом.А моя сборка - ruby ​​1.9.2p136 (2010-12-25) [i386-mingw32]

Удачи!

1 голос
/ 15 января 2013

Этот вопрос выглядит так, как будто он был заброшен, но:

Поскольку он находился в процессе перехода между версиями ruby, я подозреваю, что проблемой опа была его версия ruby.Другими словами, он фактически использовал старую версию ruby, то есть он использовал старую библиотеку CSV, а не FasterCSV.Старая библиотека CSV имеет точно такое же поведение, как описано при вводе: headers => true.

Для проверки версии ruby:

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