2012-04-18 4 views
0

基本的に私はこれらのファイルを持っています(NCBIのmedline)。それぞれはジャーナルタイトルに関連付けられています。それぞれには、0,1またはそれ以上のジェンバンク識別番号(GBID)があります。ファイルごとのGBIDの数を各ジャーナル名に関連付けることができます。私の問題は、同じジャーナルに複数のファイルが関連付けられている可能性があり、1ファイルあたりのGBIDの数をジャーナルあたりのGBIDの合計数に追加する方法がわかりません。ハッシュ値を新しい値で上書きするのではなく、どのようにハッシュ値に追加できますか?

現在のコード: jtは、ジャーナルのタイトルを表し、ファイルから適切に抜き出しています。発生したカウントにGBIDが追加されます。

全コード:

#!/usr/local/bin/ruby 

require 'rubygems' 
require 'bio' 


Bio::NCBI.default_email = '[email protected]' 

ncbi_search = Bio::NCBI::REST::ESearch.new 
ncbi_fetch = Bio::NCBI::REST::EFetch.new 


print "\nQuery?\s" 

query_phrase = gets.chomp 

"\nYou said \"#{query_phrase}\". Searching, please wait..." 

pmid_list = ncbi_search.search("pubmed", "#{query_phrase}", 0) 

puts "\nYour search returned #{pmid_list.count} results." 

if pmid_list.count > 200 
puts "\nToo big." 
exit 
end 

gbid_hash = Hash.new 
jt_hash = Hash.new(0) 


pmid_list.each do |pmid| 

ncbi_fetch.pubmed(pmid, "medline").each do |pmid_line| 

    if pmid_line =~ /JT.+- (.+)\n/ 
     jt = $1 
     jt_count = 0 
     jt_hash[jt] = jt_count 

     ncbi_fetch.pubmed(pmid, "medline").each do |pmid_line_2| 

      if pmid_line_2 =~ /SI.+- GENBANK\/(.+)\n/ 
       gbid = $1 
       jt_count += 1 
       gbid_hash["#{gbid}\n"] = nil 
      end 
     end 

     if jt_count > 0 
      puts "#{jt} = #{jt_count}" 

     end 
     jt_hash[jt] += jt_count 
    end 
end 
end 


jt_hash.each do |key,value| 
# if value > 0 
    puts "Journal: #{key} has #{value} entries associtated with it. " 
# end 
end 

# gbid_file = File.open("temp_*.txt","r").each do |gbid_count| 
# puts gbid_count 
# end 

マイ結果:

Your search returned 192 results. 
Virology journal = 8 
Archives of virology = 9 
Virus research = 1 
Archives of virology = 6 
Virology = 1 

は基本的に、どのように私はそれがウイルス学= 15のアーカイブを言ってもらうが、どの雑誌のタイトルのためですか?私はハッシュを試みましたが、ウイルス学の2番目のアーカイブは最初に上書きされました.2つのキーにハッシュ値を追加する方法はありますか?

答えて

1

私はここであなたが求めていることに完全に従っていません。

あなたはこれをやっているので、しかし、あなたが特定のハッシュ・キーのためのあなたの値を上書きしています

jt_count = 0 
jt_hash[jt] = jt_count 

あなたは既にこのように、以前のあなたのハッシュを初期化:つまり

jt_hash = Hash.new(0) 

、あらゆるキーのデフォルト値は0です。したがって、jt_hash [jt]を0に初期化する必要はありません。

この行を削除すると、

jt_hash[jt] = jt_count 

はその後jt_hashの値は、[JT]各

ncbi_fetch.pubmed(pmid, "medline").each do |pmid_line| 
    .... 
end 
+0

ありがとう!これは私にとって完璧に機能しました! – kbearski

0

変更の2行:これまで

jt_count = 0 
    jt_hash[jt] = jt_count 

if jt_hash[jt] == nil 
     jt_count = 0 
     jt_hash[jt] = jt_count 
    else 
     jt_count = jt_hash[jt] 
    end 

これだけで、そのキーにNULL値のハッシュをチェックし、それはそれで整数ヌルスティックですか。それがnullでない場合は、前の整数を戻して追加できます。

+0

はどうもありがとうございましループを通過するために蓄積しなければなりません!私はあなたのこともやっていただろうと確信しています、このサイトの皆は本当にスマートですが、私はちょうど彼の最初を見た。ありがとうございました! – kbearski

+0

ちょうどメモ、私はこれを試して、それは動作しません... – kbearski

関連する問題