2016-10-03 7 views
0

私は.CSVファイルから読み込み、すべての行の属性を持つオブジェクトを作成しようとしています。 私のコードは正常に動作します:Ruby - STDINからCSVを読む

def self.load_csv 
    puts "Name of a file?" 
    filename = STDIN.gets.chomp 
    rows = [] 
    text = File.read(filename).gsub(/\\"/,'""') 
    CSV.parse(text, headers: true, header_converters: :symbol) do |row| 
     row = row.to_h 
     row = row.each_with_object({}){|(k,v), h| h[k.to_sym] = v} 
     rows << row 
    end 

    rows.map do |row| 
     Call.new(row) 
    end 
    end 
end 

は、今私はSTDINからファイル名を撮りたかったです。私は単純に変更:

def self.load_csv(filename) 
    rows = [] 
    text = File.read(filename).gsub(/\\"/,'""') 
    CSV.parse(text, headers: true, header_converters: :symbol) do |row| 
     row = row.to_h 
     row = row.each_with_object({}){|(k,v), h| h[k.to_sym] = v} 
     rows << row 
    end 

    rows.map do |row| 
     Call.new(row) 
    end 
    end 
end 

と私はIOに文字列の暗黙の変換はエラーなしだ、とFile.readの行を削除した後、それは何もしませんルビーprogram.rbのfilename.csv試す - 多分無限ループなどを?もちろん、私はコードの異なる部分でSTDIN引数を持つceratainメソッドを呼び出します。私は過去に成功したSTDINから読み込むために類似のコードを使用しましたが、今回は間違っていますか?

+0

あなたはSTDINからファイル名を取得し、パラメータとして 'load_csv'メソッドに渡しますか? –

+0

はい、正確です。私はload_csv(STDIN)を呼び出します – Jes

+0

あなたが言ったように変更しましたが、無限ループのように何もしません。 – Jes

答えて

0

このコードが機能している:

require 'csv' 

class Call 
    def initialize(args) 
    end 
end 

def load_csv(filename) 
    rows = [] 
    text = File.read(filename).gsub(/\\"/,'""') 
    CSV.parse(text, headers: true, header_converters: :symbol) do |row| 
    row = row.to_h 
    row = row.each_with_object({}){ |(k,v), h| h[k.to_sym] = v } 
    rows << row 
    end 

    rows.map { |row| Call.new(row) } 
end 

filename = ARGV[0] 
load_csv(filename) 
+0

答えからクラス全体をコピーしてすべて同じですが、それを実行した後もまだ何もしません。私は何時間もコンピュータを去ることができます。それがうまくいかない他の理由がありますか? – Jes

+0

CSVファイルの名前を入力しましたか? 'gets'メソッドは、文字列を入力してからenterを押すまで無期限に待っています。 –

+0

ruby​​ program.rb filename.csv – Jes

関連する問題