2016-11-03 9 views
4

私はCSVファイル(約500行)を扱っています。フィルターを使ってこのファイルからデータを選択する方法はありますか?私はcsvを解析し、select/findメソッドを使ってルビーでこれを行うことができることを知っていますが、私はより簡単な構文を探しています。私は、以下の各クエリを処理するメソッドを記述したくありません。私はこれらの質問をすることができる宝石ですか?私は普通のRubyスクリプトを書いているので、非Railsソリューションを探しています。Rubyで簡単にCSVデータをフィルタリングする方法

あなたはActiveRecordの構文をしたい場合は、なぜ自身のActiveRecord使用しないで、

csv.select { |row| row['GENDER'] == 'MALE' } 
csv.select { |row| row['GENDER'] == 'MALE' || row['SALARY'] >= 10000 } 

答えて

3

私はあなたがここに宝石を必要としないと思いますか? CSVをSqliteデータベースなどにインポートします。メモリのみのテーブルに入れることができるようにするには、多くのクエリを実行する場合にはスピードアップが必要です。

require "csv" 
require "sqlite3" 
require "active_record" 

# With activerecord 
# Create our database table in to memory 
ActiveRecord::Base.establish_connection(:adapter => "sqlite3",:database => ":memory:") 
unless ActiveRecord::Base.connection.table_exists?('searchengines') 
    ActiveRecord::Schema.define do 
    create_table :searchengines do |filename_table| 
     filename_table.column :name, :string 
     filename_table.column :url, :string 
    end 
    end 
end 

class Searchengine < ActiveRecord::Base 
end 

CSV.parse(DATA, headers: true) do |row| 
    Searchengine.create({name: row[:name], url: row[:url]}) 
end 

# or with plain sql 

db = SQLite3::Database.new ":memory:" 
rows = db.execute("create table searchengines (name varchar(30), url varchar(30))") 

CSV.parse(DATA, headers: true) do |row| 
    db.execute "insert into users values (?, ?)", row.fields 
end 

# then in activerecord 

class Searchengine < ActiveRecord::Base 
end 

p Searchengine.where(name: "Google UK") 

__END__ 
    Name, URL 
Google UK, http://google.co.uk 
Yahoo UK, http://yahoo.co.uk 
+0

ありがとうアンドレイ。私は複数のデータクエリのためにこのcsvを処理する必要があるので、私はあなたが上で提案したものを書くことなく、箱からソリューションを探しています。 – Rahul

+2

@Rahulあなたは「箱から出してどういう意味ですか?」2行のコードはあなたのために十分な状態ではありませんか? :) –

+0

アンドレイ、私が意味するのは、私が指定した構文を使用できるようにする宝石/ヘルパーです。 2行のコードですが、データを何度もフィルタリングし、さまざまなフィルタ条件を使用する必要があります。 – Rahul

-1

csv.find_rows(where: {'GENDER' => 'MALE'}.count 

または

csv.find_rows(where: {'GENDER' => 'MALE', 'SALARY' >= 10000 } 
関連する問題