0

基本上我有这些文件(来自NCBI的medline)。每个都与一个期刊标题相关联。每个都有 0、1 个或多个 genbank 标识号 (GBID)。我可以将每个文件的 GBID 数量与每个期刊名称相关联。我的问题是我可能有多个文件与同一期刊关联,我不知道如何将每个文件的 GBID 数添加到每个期刊的 GBID 总数中。

我当前的代码:jt 代表期刊标题,从文件中正确提取。GBID 会在遇到时添加到计数中。

完整代码:

 #!/usr/local/bin/ruby

 require 'rubygems'
 require 'bio'


Bio::NCBI.default_email = 'kepresto@uvm.edu'

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,但是对于任何期刊标题?我尝试了一个哈希,但是第二个病毒学档案只是覆盖了第一个......有没有办法让两个键在哈希中添加它们的值?

4

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
于 2012-04-18T04:26:37.227 回答
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

这只是检查该键处的空值的哈希值,如果它是空值,则在其中插入一个整数。如果它不为空,则返回前一个整数,以便您可以添加它。

于 2012-04-18T04:19:06.590 回答