2012-04-18 58 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