1

Ruby でデータ取得メカニズムを一般化しようとしていますが、次のようにドット演算子を使用して CSV ファイルを取得し、行の列の 1 つにアクセスする方法を見つけることができないようです。

CSV テーブルがあるとします。

#some_file.csv
name,age
albert,13

そして、そこから FasterCSV テーブルを作成します。

a = FasterCSV.new(File.open('some_file.csv'), :headers => :first_row)

次に、行にアクセスするときに、次のように言えます。

a[0].name
=> 'albert'

それ以外の

a[0]['name']
=> 'albert'

誰もそれを行う方法を知っていますか?

4

2 に答える 2

3

見つからない場合はFasterCSV::Row、次のようなクラスにいつでもモンキー パッチを適用できます。

class FasterCSV::Row
  def method_missing(m,*args)
    if self.field?(m.to_s)
      return self[m.to_s]
    else
      super
    end
  end
end

(自分でコードを試したことはありません。)

PS。データ取得メカニズムを一般化しているので、CSV は、サポートを計画しているいくつかのデータ ソースの 1 つにすぎないと思います。その場合の論理的な方法は、データ ソースごとに 1 つのラッパー クラスを作成し、いくつかの共通インターフェイス (行フィールドへのアクセスにアクセサーを使用する場合と使用しない場合があります) を使用することです。ただし、その下では、メソッドを使用して通常の方法で CSV 行にアクセスする必要があります[]。それで、グレンジャミンがすでに尋ねたように、なぜこれが必要なのですか? ;)

于 2010-03-09T16:38:20.653 に答える
2

最も簡単な答えは..なぜですか?

ほとんどがシンタックス シュガーであると仮定します。そのため、必要な処理を実行する小さなモンキー パッチを次に示します。

class FasterCSV::Row
  def method_missing(row)
    field(row)
  end
end

既存の Row メソッドと競合するフィールド名は、このようには機能しないことに注意してください。

于 2010-03-09T16:40:40.337 に答える