如何在Ruby中轻松过滤CSV数据

时间:2016-11-03 11:53:05

标签: ruby-on-rails ruby csv

我正在处理CSV文件(大约500行)。有没有办法从过滤器中选择此文件中的数据。我知道我可以通过解析csv和使用select / find方法在ruby中做到这一点但我正在寻找一种更简单的语法。我不想编写处理以下每个查询的方法。任何允许我进行这些查询的宝石?我正在寻找一个非Rails解决方案,因为我正在编写一个简单的ruby脚本。

e.g。

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

csv.find_rows(where: {'GENDER' => 'MALE', 'SALARY' >= 10000 }

2 个答案:

答案 0 :(得分:6)

我认为你不需要宝石:

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

答案 1 :(得分:-1)

如果你想要activerecord语法,为什么不使用activerecord本身呢? 将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