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

Как пропустить строку заголовка при чтении CSV в Ruby?

Ruby CSV класс упрощает итерацию по каждой строке:

CSV.foreach(file) { |row| puts row }

Однако это всегда включает строку заголовка, поэтому я получаю как вывод:

header1, header2
foo, bar
baz, yak

Мне не нужны заголовки. Теперь, когда я звоню...

CSV.foreach(file, :headers => true)

Получаю этот результат:

#<CSV::Row:0x10112e510
    @header_row = false,
    attr_reader :row = [
        [0] [
            [0] "header1",
            [1] "foo"
        ],
        [1] [
            [0] "header2",
            [1] "bar"
        ]
    ]
>

Конечно, потому что в документации говорится:

Этот параметр заставляет #shift возвращать строки как объекты CSV:: Row вместо массивов

Но, , как я могу пропустить строку заголовка, возвращая строку как простой массив? Я не хочу, чтобы возвращался сложный объект CSV::Row.

Я определенно не хочу этого делать:

first = true
CSV.foreach(file) do |row|
  if first
    puts row
    first = false
  else
    # code for other rows
  end
end
4b9b3361

Ответ 1

Посмотрите #shift из класса CSV:

Основной метод чтения для обернутых строк и IO, одна строка вытягивается из источника данных, анализируется и возвращается как массив полей (если строки заголовка не используются)

Пример:

require 'csv'

# CSV FILE
# name, surname, location
# Mark, Needham, Sydney
# David, Smith, London

def parse_csv_file_for_names(path_to_csv)
  names = []  
  csv_contents = CSV.read(path_to_csv)
  csv_contents.shift
  csv_contents.each do |row|
    names << row[0]
  end
  return names
end

Ответ 2

Возможно, вы захотите рассмотреть CSV.parse(csv_file, { :headers => false }) и передать блок, как упоминалось здесь

Ответ 3

Классный способ игнорировать заголовки состоит в том, чтобы прочитать его как массив и игнорировать первую строку:

data = CSV.read("dataset.csv")[1 .. -1]
# => [["first_row", "with data"],
      ["second_row", "and more data"],
      ...
      ["last_row", "finally"]]

Проблема с подходом :headers => false заключается в том, что CSV не будет пытаться прочитать первую строку в качестве заголовка, но будет считать ее частью данных. Итак, в основном, у вас есть бесполезная первая строка.