CSV は、ヘッダーとフィールドの「コンバーター」をサポートしています。これにより、データがeach
ループに渡される前に内部に入ることができます。
サンプル CSV ファイルの作成:
csv = "First,Last,Email ,Mobile Phone ,Company,Title ,Street,City,State,Zip,Country, Birthday,Gender ,Contact Type
first,last,email ,mobile phone ,company,title ,street,city,state,zip,country, birthday,gender ,contact type
"
File.write('file_upload_example.csv', csv)
これが私がそれを行う方法です:
require 'csv'
csv = CSV.open('file_upload_example.csv', :headers => true)
[:convert, :header_convert].each { |c| csv.send(c) { |f| f.strip } }
csv.each do |row|
puts "First Name: #{row['First']} \nLast Name: #{row['Last']} \nEmail: #{row['Email']}"
end
どの出力:
First Name: 'first'
Last Name: 'last'
Email: 'email'
コンバーターは、ファイルから読み取るときに、各ヘッダーと各フィールドから先頭と末尾の空白を単純に取り除きます。
また、プログラミング設計の選択として、次を使用してファイルをメモリに読み込まないでください。
csv_text = File.read('file_upload_example.csv')
次に、それを解析します。
csv = CSV.parse(csv_text, :headers => true)
次にループします。
csv.each do |row|
Ruby の IO システムは、ファイルの行ごとの「列挙」をサポートしています。私のコードがCSV.open
実行されると、ファイルは読み取り可能になり、各行がeach
読み取られます。each
ファイル全体を一度にメモリに入れる必要はなく、スケーラブルではありません (ただし、新しいマシンではより合理的になっています)。、おそらくそれを読み取って解析し、解析されたファイルを反復処理するのと同じくらい高速です。