我正在使用ruby 1.9.2。我的csv文件如下..,
NAME, Id, No, Dept
Tom, 1, 12, CS
Hendry, 2, 35, EC
Bahamas, 3, 21, IT
Frank, 4, 61, EE
我想打印一个特定的行('Tom')。我在很多方面尝试过,但我没有找到确切的结果。最推荐的选项是“Fastercsv”。但它适用于我的版本。另外,我注意到csv以列方式打印字段。如何在rails中使用csv打印整行。我的ruby代码如下
require 'csv'
csv_text = File.read('sampler.csv')
csv = CSV.parse(csv_text, :headers => true)
csv.each do |row|
puts "#{row[:NAME]},#{row[:Id]},#{row[:No]},#{row[:Dept]}"
end
答案 0 :(得分:18)
.find
csv = CSV.read( "sampler.csv", header: true )
puts csv.find {|row| row['NAME'] == 'Tom'} #=> returns first `row` that satisfies the block.
答案 1 :(得分:4)
这是将代码保留在CSV API中的另一种方法。
csv_table
是CSV::Table
row
是CSV::Row
row_with_specified_name
是CSV::Row
。
csv_table = CSV.table("./tables/example.csv", converters: :all)
row_with_specified_name = csv_table.find do |row|
row.field(:name) == 'Bahamas'
end
p row_with_specified_name.to_csv.chomp #=> "Bahamas,3,21,IT"
仅供参考,CSV.table
只是以下的捷径:
CSV.read( path, { headers: true,
converters: :numeric,
header_converters: :symbol }.merge(options) )
根据the docs。
答案 2 :(得分:0)
如果您有一个很大的 CSV 文件并且想要找到确切的行,那么一次读取一行会更快并且内存占用更少。
require 'csv'
csv = CSV.open('sampler.csv', 'r', headers: true)
while row = csv.shift
if row['name'] == 'Bahamas'
break
end
end
pp row