0

2つのレコードタイプを持つ構造化されたコンマ区切りファイルがあります。さまざまなレコードは、ヘッダーエントリ(HまたはP)によって区別されます。ファイル形式は次のとおりです。

"H","USA","MD","20904"
"P","1","A","Female","W"
"P","2","A","Male","H"

ファイルをインポートしてから、インポートしたデータを使用してアクティブレコードモデルを作成したいと思います。私が使用しているアプローチは、フィールドの数、オブジェクト名、および列を含むフィールドマップを作成することです。

次に、フィールドマップを利用します

$ field_map =

{
  'H'   =>
    {
      :count => 4,
      :object => :Header,
      :cols => [:record_type, :country_id, :state, :zip]
    },

  'R'   =>
    {
      :count => 4,
      :object => :RaceData,
      :cols => [:record_type, :household_size, :gender, :race]
    }
}

次に、FastCSVを使用してファイルをインポートし、caseステートメントを使用して、ファイルがどのように変換され、activerecordcreateステートメントで使用されるかを示します。

FasterCSV.foreach(filename) do |row|
    tbl_type = row[0]
    tbl_info = $field_map[tbl_type]

   unless (tbl_info.nil?)
     field_no = tbl_info[:count]
     object = tbl_info[:object]
     columns = tbl_info[:cols]
     record_type = new_record[:record_type]
     case record_type
         when "H"
         factory_build_h_record(new_record)
         when "P"
         factory_build_p_record(new_record)
     end
   end
 end

上記のコードは、スペースの制約のために要約されています。私のアプローチは問題なく機能しますが、私はルビーに不慣れであり、常にベストプラクティスと「真の」Rubyのやり方に興味を持っています。より経験豊富なプログラマーがこの問題にどのように取り組むかを聞きたいと思います。ご入力いただきありがとうございます。

4

1 に答える 1

0

私は提案しますgem 'roo'

ここにソースコードの例がありますが、私はむしろ10分のビデオを見ます

于 2013-02-12T01:10:40.693 に答える