28

RubyのCSVクラスを使用すると、各行を非常に簡単に反復できます。

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

ただし、これには常にヘッダー行が含まれるため、出力として取得します。

header1, header2
foo, bar
baz, yak

ヘッダーは必要ありません。さて、電話すると…</ p>

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
4

3 に答える 3

16

ここで述べたように、ブロックを検討CSV.parse(csv_file, { :headers => false })して渡すことをお勧めします

于 2012-07-31T21:08:21.640 に答える
16

CSV クラスの#shiftを見てください。

ラップされた文字列と IO の主要な読み取り方法です。データ ソースから 1 行が取得され、解析され、フィールドの配列として返されます (ヘッダー行が使用されていない場合)。

例:

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
于 2012-07-31T12:57:04.220 に答える
9

ヘッダーを無視するクールな方法は、ヘッダーを配列として読み取り、最初の行を無視することです。

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

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

于 2013-12-16T23:30:50.217 に答える