2017-11-07 9 views
0

私はtxtファイルから行を取得する次のコードを持っています。私はアプリケーションでそれを使用できるようにitem_priceのすべての値を合計したいと思います。私は、この値はブロックの外に取り出すことがしたいと思います:csvの行を合計する方法

module ParseText 
    def self.parse 
    require 'csv' 
    dir = Dir.glob("./public/system/file_attaches/files/*/*/*/*/*").max_by {|f| File.mtime(f)} 
    CSV.foreach(dir, col_sep: "\t", headers: true).map do |row| 
     records = row.to_h 
     purchaser = records["purchaser name"] 
     item_description = records["item description"] 
     item_price = records["item price"] 
     purchase_count = records["purchase count"] 
     merchant_address = records["merchant_address"] 
     merchant_name = records["merchant name"] 

     Merchant.create(name: merchant_name) 
     MerchantAddress.create(street: merchant_address, merchant_id: Merchant.last.id) 
     Purchaser.create(name: purchaser, count: purchase_count, merchant_id: Merchant.last.id) 
     Item.create(description: item_description, price: item_price, merchant_id: Merchant.last.id, purchaser_id: Purchaser.last.id) 
    end 
    end 
end 
+0

あなたは 'TOTAL_PRICEを定義し、なぜちょうど=' TOTAL_PRICE + = item_price'を使用しない:

CSV.foreach(dir, col_sep: "\t", headers: true).map do |row| 

は、コードをフォロー0.0」となる。 – Anthony

+0

@Anthonyの言うことはうまくいくが、ブロックの外側にあるvarを初期化したくない場合は、 '#inject'で結果を得ることができる。詳細は私の答えを見てください。 – hoffm

+0

@Anthony、私が取得しようとすると:文字列はフロートに強制することはできません –

答えて

2
CSV.foreach(dir, col_sep: "\t", headers: true).inject(0) do |price_sum, row| 
    # Leave the code you already have here 
    price_sum += item_price.to_i 
end 
+0

ハム...私は試してみますが、私はこのエラーが発生します:文字列はFixnumに強制することはできません –

+0

'item_price'は文字列でなければなりません。あなたはそれをfloatまたはintにキャストする必要があります。コードを後者で更新します。 – hoffm

+0

それはうまくいっていますが、変数price_sumをブロックからどのように使用できますか? –

関連する問題