Как пропустить строку заголовка при чтении 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
Ответы
Ответ 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
не будет пытаться прочитать первую строку в качестве заголовка, но будет считать ее частью данных. Итак, в основном, у вас есть бесполезная первая строка.