0

次のようなFASTAファイルがあります

>header1
AAAAA
AAA
>header2
BBBBB

DBI を使用して perl 経由で SQLite テーブルを作成できました。

#!/usr/bin/perl
use strict;
use warnings;
use DBI;

my $dbh = DBI->connect( "DBI:SQLite:dbname=gene.db" , "" , "" ,
                    { PrintError => 0 , RaiseError => 1 } );
$dbh->do("DROP TABLE IF EXISTS genes");
$dbh->do("CREATE TABLE genes(gene_name VARCHAR(50) PRIMARY KEY, sequence TEXT)");

parse();
sub parse{
my $fasta_file = 'example.faa';
my $header='';
my $sequence='';

open(INPUT, $test_file) || die "ERROR: can't read input file: $!";
    while(<INPUT>){
        if(/^>(.+?)/){
           $header=$1;
          #$dbh->do("INSERT INTO genes VALUES('$header','$sequence')");
           $sequence='';
        }else{
           $sequence.=$_;
        }
     }
}
$dbh->disconnect();

これで、ヘッダーとシーケンスがデータベースに挿入されることがわかり$dbh->do("INSERT INTO genes VALUES('$header','$sequence')");ましたが、特に最初のエントリに複数行のシーケンスがある場合、最初のエントリに問題があります。最初のエントリのシーケンスが 2 番目にシフトされているようです。$dbh->doステートメントをelseに移動しようとしましたが、エラーが発生する可能性があります。考え?

sqlite> select * from Genes;
header      sequence
----------  ----------  
header1      
header2     AAAAAAAA

do()ステートメントをelse句に入れると、次のエラーが発生します。

DBD::SQLite::db do failed: column header is not unique
4

2 に答える 2

0

whileループでのステートメントの順序は、順序が狂っていると思います。また、新しい行を削除するには、を追加する必要がありますchomp(保持する予定がない場合)。

open(INPUT, $test_file) || die "ERROR: can't read input file: $!";
    while(<INPUT>){
        chomp;
        if(/^>(.+)/){
            $dbh->do("INSERT INTO genes VALUES('$header','$sequence')") if $sequence;
            $header=$1;
            $sequence='';
        }else{
           $sequence.=$_;
        }
     }
     $dbh->do("INSERT INTO genes VALUES('$header','$sequence')") if $sequence;

         }

更新:最後のレコードを取得するために、whileループの後に最後の$dbh->doを追加しました。

于 2013-03-06T00:56:22.430 に答える
0

最初のエントリには $sequence の値がないため、コードを次のようにリファクタリングします。

if(/^>(.+?)/) {
   $header=$1;

} else{
   $sequence = $_;
   $dbh->do("INSERT INTO genes VALUES(?, ?)", undef, $header, $sequence );  
}

$dbh->do 構文に注意してください。このモードは、SQL インジェクションの問題を回避します。

于 2013-03-05T22:12:48.197 に答える