2016-10-05 10 views
1

すべての行が特定の期間、番号などを持つ1つの呼び出しを表す行を持つ.csvファイルがあります。Callオブジェクトの配列を作成する必要があります。パラメータのハッシュは簡単です.CSVから行を取得するだけです。しかし何らかの理由でそれがうまくいきません - 私がCall.new(raw_call)を呼び出すと、それはnilです。 私は出力を見ることも不可能です - 私はputsをコードのさまざまな場所(ブロック内など)に配置し、単に何も表示しません。私は明らかに別のクラスがある - 私の.csvファイルの小さなサンプルRuby - .csvから読み込んでオブジェクトを作成する

require 'csv' 
class CSVCallParser 
    attr_accessor :io 

    def initialize(io) 
    self.io = io 
    end 

    NAMES = { 
    a: :date, 
    b: :service, 
    c: :phone_number, 
    d: :duration, 
    e: :unit, 
    f: :cost 
    } 

    def run 
    parse do |raw_call| 
    parse_call(raw_call) 
    end 
    end 

    private 

    def parse_call(raw_call) 
    NAMES.each_with_object({}) do |name, title, memo| 
     memo[name] = raw_call[title.to_s] 
    end 
    end 

    def parse(&block) 
    CSV.parse(io, headers: true, header_converters: :symbol, &block) 
    end 

end 

CSVCallParser.new(ARGV[0]).run 

Call、コールのために初期化し保持しているなど:ヘッダと1行:

"a","b","c","d","e","f" 
"01.09.2016 08:49","International","48627843111","0:29","","0,00" 
+0

作業しているcsvファイルのサンプルを少し提供できますか?だから私はあなたのコードを再現し、何が起こっているのを見ることができます – davidhu2000

+0

確かに、私は私の投稿を編集しました:) – Jes

答えて

2

私は」にISNいくつかのことに気づきました期待どおりに進む。

def parse_call(raw_call) 
    NAMES.each_with_object({}) do |name, title, memo| 
    memo[name] = raw_call[title.to_s] 
    end 
end 

parse_call方法において、Iはnametitle、及びmemoを印刷しようとしました。 :a:date{}を実際に受け取ったのですが、実際には[:a,:date],{}nilとなりました。あなたがraw_call[name]を使用して、キーがraw_call内のシンボルであるため、文字列に助けないことを変換する必要がありますので

また、raw_callヘッダは、ない:date, :service...:a,:b,:c...を、あります。また

だから私は

def parse_call(raw_call) 
    NAMES.each_with_object({}) do |name_title, memo| 
    memo[name_title[1]] = raw_call[name_title[0]] 
    end 
end 

name_title[1]に機能を変更にタイトル(:date:service、など)

name_title[0]は(:a:bなど)の名前を返します

、中この方法

def run 
    parse do |raw_call| 
    parse_call(raw_call) 
    end 
end 

あなたは私はあなたがそうnil

を取得しているので、もし私の出力はライン

p CSVCallParser.new(File.read("file1.csv")).run 

、私は、今

def run 
    res = [] 
    parse do |raw_call| 
     res << parse_call(raw_call) 
    end 
    res 
    end 

にそれを変更し、あなたが得るすべての結果を返していませんget(CSVサンプルにさらに2行追加)

[{:date=>"01.09.2016 08:49", :service=>"International", :phone_number=>"48627843111", :duration=>"0:29", :unit=>"", :cost=>"0,00"}, 
{:date=>"02.09.2016 08:49", :service=>"International", :phone_number=>"48622454111", :duration=>"1:29", :unit=>"", :cost=>"0,00"}, 
{:date=>"03.09.2016 08:49", :service=>"Domestic", :phone_number=>"48627843111", :duration=>"0:29", :unit=>"", :cost=>"0,00"}] 

あなたがそう

ruby csv_call_parser.rb calls.csv 

(この場合、calls.csvARGVへの引数として渡される)

のように、端末からこのプログラムを実行する場合は、最後の行を変更することによって行うことができますルビーファイル。

p CSVCallParser.new(File.read(ARGV[0])).run 

また、これは前のようなハッシュと配列を返します。

+0

非常に非常にありがとう、あなたの変更は、問題の完全な理解に私を近づけています。もう1つのことがあります:ruby csv_call_parser.rb calls.csvのようにプログラムを実行したいので、CSVCallParser.new(ARGV [0])。runまたはCSVCallParser.new(File.read()この仕事のどれも実行しません。 – Jes

+0

私の更新を参照してください。あなたのコメントに似ているようですが、ターミナルにハッシュ配列を印刷することができました。 – davidhu2000

+0

ありがとう名前とタイトルを使用するのが主な問題だったのですが、name_title [0]と[1]として使用するとすべての違いがありましたか? – Jes

関連する問題