2012-07-31 26 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" 
     ] 
    ] 
> 

、ドキュメントが言うので:

この設定は、CSVとして行を返すように#shiftが発生します。 :配列の代わりに行オブジェクト

しかし、どのようにすることができますか私はヘッダー行をスキップし、単純な配列として行を返しますか?私は複雑なCSV::Rowオブジェクトが返されることを望んでいません。 CSVクラスから#shift

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

check http://stackoverflow.com/a/37856698/473040 – equivalent8

答えて

12

はルック:私は間違いなくこの行うにはしたくない

包まれた文字列とiOS用

主readメソッドを、単一の行をから引き出されますデータソースは、解析され、(ヘッダ行が使用されていない場合)フィールドの配列

アン例として返さ:

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配列を返し、#shiftは配列のデフォルトメソッドです。ここで訂正してください。 – PriteshJ

+0

また、 'each_with_index'を使って反復処理を行い、現在表示されている行インデックスを確認することもできます。 'next if(i == 0)'はインデックス 'i'の最初の行をスキップします。 – tadman

+0

@tadman別の回答として掲載しても構いません。 – slhck

10

ヘッダを無視するクールな方法は、配列として、それを読んで、最初の行を無視することであるhere

+1

注:これはRuby 1.9以降でのみ動作します。 – inger

+8

注: ocodo

6

を述べたようにあなたは、CSV.parse(csv_file, { :headers => false })とブロックを渡すを検討する必要があります:

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

:headers => falseアプローチの問題は、CSVが最初の行をヘッダーとして読み取ろうとはしませんが、データの一部とみなされます。だから、基本的に、あなたは役に立たない最初の行を持っています。

関連する問題