Подтвердить что ты не робот

Как найти определенную строку в csv

Я использую 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 печатает поле в виде столбца. Как печатать целую строку с помощью 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
4b9b3361

Ответ 1

Используйте .find

csv = CSV.read( "sampler.csv", header: true )

puts csv.find {|row| row['NAME'] == 'Tom'} #=> returns first 'row' that satisfies the block.

Ответ 2

Здесь другой подход, который держит код в 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) )

Согласно документам.