2011-09-14 13 views
0

ファイル(genbank)から情報を抽出するルビスクリプトがあり、このデータをデータベースにロードしたいと思います。activerecordを使用してデータベースにデータをロードする方法

require 'rubygems' 
require 'bio' 
require 'snp_db_models' 
establish_connection 

snp_positions_file = File.open("snp_position.txt") 
outfile = File.open("output.txt", "w") 
genome_sequence = Bio::FlatFile.open(Bio::EMBL, "ref.embl").next_entry 

snp_positions = Array.new 
snp_positions_file.gets # header line 
while line = snp_positions_file.gets 
    snp_details = line.chomp.split("\t") 
    snp_seq = snp_details[1] 
    snp_positions << snp_details[1].to_i 
end 


mean_snp_per_base = snp_positions.size/genome_sequence.sequence_length.to_f 
puts "Mean snps per base: #{mean_snp_per_base}" 

#outfile = File.open("/Volumes/DataRAID/Projects/GAS/fastq_files/bowtie_results/snp_annotation/genes_with_higher_snps.tsv", "w") 
outfile.puts("CDS start\tCDS end\tStrand\tGene\tLocus_tag\tnote\tsnp_ID\ttranslation_seq\tProduct\tNo_of_snps_per_gene\tsnp_rate_vs_mean") 

genome_sequence.features do |feature| 
    if feature.feature !~ /gene/i && feature.feature !~ /source/i 
    start_pos = feature.locations.locations.first.from 
    end_pos = feature.locations.locations.first.to 

    number_of_snps_in_gene = (snp_positions & (start_pos..end_pos).to_a).size # intersect finds number of times snp occurs within cds location 
    mean_snp_per_base_in_gene = number_of_snps_in_gene.to_f/(end_pos - start_pos) 

    outfile.print "#{start_pos}\t" 
    outfile.print "#{end_pos}\t" 
    if feature.locations.locations.first.strand == 1 
     outfile.print "forward\t" 
    else 
     outfile.print "reverse\t" 
    end 

    qualifiers = feature.to_hash 

    ["gene", "locus_tag", "note", "snp_id", "translation", "product"].each do |qualifier| 
     if qualifiers.has_key?(qualifier) # if there is gene and product in the file 
     # puts "#{qualifier}: #{qualifiers[qualifier]}" 

     outfile.print "#{qualifiers[qualifier].join(",")}\t" 
     else 
     outfile.print " \t" 
     end 
    end 

    outfile.print "#{number_of_snps_in_gene}\t" 
    outfile.print "%.2f" % (mean_snp_per_base_in_gene/mean_snp_per_base) 
    outfile.puts 
end 
end 
outfile.close 

がどのようにデータベースにOutfile.txtを内のデータを読み込むことができます。

require 'active_record' 
def establish_connection(db_location= "protein.db.sqlite3") 
    ActiveRecord::Base.establish_connection(
    :adapter => "sqlite3", 
    :database => db_location, 
    :pool => 5, 
    :timeout => 5000 
) 
end 

これは、データを出力し、私のスクリプトは次のとおりです。私は、モデルとスキーマと接続スクリプトを作成しました。私はマーシャルダンプのようなことをしなくてはなりませんか?事前に

おかげ

マーク

+0

コメント数に応じてRubyとして記録されます。 –

答えて

0

あなたがこれを行うためのrakeタスクを書くことができます。 lib/tasksに保存し、.rakeの内線番号を付けます。

desc "rake task to load data into db" 
task :load_data_db => :environment do 
    ... 
end 

レール環境がロードされているため、どのRailsモデル/コントローラと同じようにモデルに直接アクセスできます。もちろん、レーキタスクを実行するときに定義された環境変数に応じて、データベースに接続します。

+0

私はWebアプリケーションを作成していないので、lib/tasksはありません。 Iveはactiverecordを使ってデータベースを作成しましたが、このデータをダンプしたいのです – Mark

+0

この質問は 'Ruby'の代わりに 'ruby on rails'とタグ付けされるべきではありません。 @むしろ放課後のアプローチを見てください。 –

0

単なるスクリプトでは、モデルは不明です。

Railsアプリケーションの場合と同じように、最小値を定義する必要があります。そうでない場合は、Railsコンテキストで、Railsアプリケーションの詳細を認識しているレーキタスクを使用してください。

+1

ありがとうございますが、これはどのようにデータをデータベースにダンプしますか? – Mark

+0

データベース内に列とテーブルを作成するために必要なデータの種類ごとにモデルを作成してください。これが完了したら、単純にActiveRecord構文のsugar 'Foo.create(:bar => "value"、:baz => 123)を使用します。 – apneadiving

+0

私はモデルを作成してテーブルなどを作成しました。 hundereds行と9列のファイル。私はこれを自動的に破棄したい。私はoutfileのすべての行を読み込んでダンプしたり、マーシャルダンプのようなものを使うスクリプトを書いていますか? – Mark

関連する問題