2012-04-18 59 views
0

基本上我有這些文件(來自NCBI的medline)。每個都與期刊標題相關聯。每個都有0,1個或更多的Genbank識別碼(GBID)。我可以將每個文件的GBID與每個日記名稱的數量關聯起來。我的問題是我可能有多個文件與同一個日誌相關聯,我不知道如何將每個文件的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的檔案,但對於任何雜誌的標題?我嘗試了一個散列,但第二個病毒學檔案剛剛覆蓋了第一個......有沒有辦法讓兩個鍵在散列中添加它們的值?

回答

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 2012-04-18 14:15:29

0

更改這兩行:

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,則返回前一個整數,以便添加到它。

+0

非常感謝您!我相信你的工作也會有效,這個網站上的每個人都非常聰明,但我碰巧看到他的第一個。謝謝! – kbearski 2012-04-18 14:16:11

+0

只是一個說明,我沒有嘗試這個,它不工作... – kbearski 2012-04-25 15:35:41