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 と言うようにするにはどうすればよいでしょうか。ハッシュを試してみましたが、ウイルス学の 2 番目のアーカイブが最初のアーカイブを上書きしてしまいました... 2 つのキーの値をハッシュに追加する方法はありますか?

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

次の 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 でない場合は、以前の整数を返し、追加できるようにします。

于 2012-04-18T04:19:06.590 に答える