2009-08-31 21 views
1

タイトルは本当に本当に物事を説明していません。私の状況は、ファイルを読み込んで内容をハッシュに入れたいと思うことです。さて、私はそれを賢明にしたい、私はディレクトリ内のすべてのファイルを開き、ハッシュに入れるループを作成したい。問題は、ファイル名に関連して名前を割り当てる方法がわかりません。例:既に新しい変数名が割り当てられている場合、どのように新しい変数名を割り当てますか? Ruby

hash={} 
Dir.glob(path + "*") do |datafile| 
    file = File.open(datafile) 
    file.each do |line| 
    key, value = line.chomp("\t") 
    # Problem here is that I wish to have a different 
    # hash name for every file I loop through 
    hash[key]=value 
    end 
    file.close 
end 

これは可能ですか?

+0

をどのようにハッシュのハッシュについて。最初のハッシュはキーがファイル名になっていますか?それは働くだろうか? – theIV

+0

ああ、私はいくつかの人々が私の下にそれを打つことを参照してください! :)あなたはevalをせずに、新しく作成された変数にアクセスすることはできませんそれにもかかわらず要求された方法 – theIV

答えて

1

処理するファイルの名前で変数を動的に作成したいですか?あなたが最初のファイル名をrubifyことを確認しなければならないでしょう。もちろん、

Dir.glob(path + "*") do |fileName| 
    File.open(fileName) { 

    # the variable `hash` and a variable named fileName will be 
    # pointing to the same object... 
    hash = eval("#{fileName} = Hash.new") 

    file.each do |line| 
     key, value = line.chomp("\t") 
     hash[key]=value 
    end 
    } 
end 

はこれを試してみてください。 「bla.txt」という名前の変数はRubyで有効ではないではないでしょう、どちらも「パス/に/ bla.csv」

+0

+1。スペースや引用符を含むファイル名も(この中でも)このアプローチを破るでしょう。 – bobDevil

+0

ノートに問題を解決するための – sepp2k

+1

私は「要求された方法でファイルを解決する」ことが必ずしも美徳ではないと思います。質問者が最良の方法が何であるかを確かめるのに十分なことを知っていれば、彼はおそらくここにいないだろう。 – Chuck

0

は、あなただけの次の手順を実行できませんか?

filehash = {} # after the File.open line 

... 
# instead of hash[key] = value, next two lines 
hash[datafile] = filehash 
filehash[key] = value 
0

あなたはこのようなものを使用したい場合があります:

hash[file] = {} 
hash[file][key] = value
8

なぜドン」あなたのキーがファイル名(あなたの場合 "データファイル")であり、その値があなたのデータを挿入するハッシュ値であるハッシュを使用するか?あなたは動的変数を作成したい場合は

hash = Hash.new { |h, key| h[key] = Hash.new } 
Dir.glob(path + '*') do |datafile| 
    next unless File.stat(datafile).file? 
    File.open(datafile) do |file| 
    file.each do |line| 
     key, value = line.split("\t") 
     puts key, value 
     # Different hash name for every file is now hash[datafile] 
     hash[datafile][key]=value 
    end 
    end 
end 
+2

'File.open'と' file.each'を 'File.foreach(datafile)do | line |'に置き換えることができます。 – sepp2k

1

、あなたもそのインスタンス変数もOKと仮定(#instance_variable_set使用することができます。

Dir.glob(path + "*") do |datafile|    
    file = File.open(datafile)      
    hash = {}          
    file.each do |line|        
    key, value = line.chomp("\t")     
    hash[key] = value        
    end            
    instance_variable_set("@file_#{File.basename(datafile)}", hash)  
end 

これだけ作品をファイル名は、有効なRubyの変数名があるとき。そうでなければ、あなたはいくつかの変換が必要になり

0

2つのハッシュが今十分です ファイルハッシュ - 。。> lineHash - >コンテンツを

関連する問題