18

余分な空白を含む文字列があります:

First,Last,Email  ,Mobile Phone ,Company,Title  ,Street,City,State,Zip,Country, Birthday,Gender ,Contact Type

この行を解析して空白を削除したい。

私のコードは次のようになります:

namespace :db do
task :populate_contacts_csv => :environment do

require 'csv'

csv_text = File.read('file_upload_example.csv')
  csv = CSV.parse(csv_text, :headers => true)
    csv.each do |row|
      puts "First Name: #{row['First']} \nLast Name: #{row['Last']} \nEmail: #{row['Email']}"
    end
  end
end
4

3 に答える 3

63
@prices = CSV.parse(IO.read('prices.csv'), :headers=>true, 
   :header_converters=> lambda {|f| f.strip},
   :converters=> lambda {|f| f ? f.strip : nil})

nil テストは行に追加されますが、ヘッダー コンバーターは追加されません。ヘッダーは決して nil ではなく、データは nil になる可能性があり、nil には strip メソッドがないと仮定します。私の知る限り、 :strip が事前定義されたコンバーターではないことに本当に驚いています!

于 2013-04-07T08:44:35.080 に答える
3

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ファイル全体を一度にメモリに入れる必要はなく、スケーラブルではありません (ただし、新しいマシンではより合理的になっています)。、おそらくそれを読み取って解析し、解析されたファイルを反復処理するのと同じくらい高速です。

于 2013-01-21T17:14:58.930 に答える
3

strip最初にハッシュできます:

csv.each do |unstriped_row|
  row = {}
  unstriped_row.each{|k, v| row[k.strip] = v.strip}
  puts "First Name: #{row['First']} \nLast Name: #{row['Last']} \nEmail: #{row['Email']}"
end

ハッシュキーも削除するように編集

于 2013-01-21T16:06:36.697 に答える