2012-07-31 132 views
18

Ruby的CSV類使它很容易的每一行遍歷:如何在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: :行對象而不是陣列

但是,怎麼可以我跳過標題行,將行作爲簡單數組返回?我不想複雜的CSV::Row對象被返回。

我絕對不希望這樣做:

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

檢查http://stackoverflow.com/a/37856698/473040 – equivalent8 2016-06-16 10:35:29

回答

12

#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 
+0

CSV.read返回ans Array和#shift是數組的默認方法。並修正在這裏非常有用。 – PriteshJ 2012-07-31 13:53:55

+0

你也可以迭代使用'each_with_index'並檢查你正在使用哪一行索引。 'next if(i == 0)'會跳過索引'i'的第一行。 – tadman 2012-07-31 15:59:47

+0

@tadman隨意張貼,作爲一個單獨的答案 - 看起來可行。 – slhck 2012-08-01 11:31:41

10

你可能要考慮CSV.parse(csv_file, { :headers => false }),並傳遞一個塊,如前所述here

+1

注意:這隻適用於Ruby 1.9 – inger 2013-05-15 16:42:16

+8

附加說明:如果您使用 ocodo 2013-12-16 23:33:14

6

一個很酷的方式忽略頭被讀取它作爲一個數組,而忽略第一行:

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

:headers => false方法的問題在於CSV不會嘗試讀取第一行作爲標題,但會將其視爲數據的一部分。所以,基本上,你有一個無用的第一行。

相關問題