2013-03-05 64 views
0

我有一個FASTA文件如下如何解析FASTA文件並使用DBI在Perl中將序列提交到SQLite數據庫文件?

>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')");將插入頁眉和順序到數據庫中,但我在使用的第一項問題,尤其是如果第一個項目有一個多行序列。第一個條目的順序似乎被下移到第二個條目。我試圖將$dbh->do聲明移入其他位置,但我可能會出現錯誤。思考?

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

我碰到下面的錯誤,如果我把do()語句else子句。

DBD::SQLite::db do failed: column header is not unique 
+0

定義「問題」。你有錯誤信息嗎? – Cfreak 2013-03-05 22:08:03

+0

@Cfreak對不起,我在完全解釋之前提交了問題。我得到以下錯誤:DBD :: SQLite :: db失敗:列標題不是唯一 – Stephen 2013-03-05 22:21:05

回答

0

的第一項有$序列沒有價值,所以我重構你的代碼是這樣的:

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

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

注意$ dbh->做語法,這種模式避免了SQL注入問題

+0

我仍然收到以下錯誤:DBD :: SQLite :: db失敗:列標題不是唯一的。有任何想法嗎? – Stephen 2013-03-05 22:26:29

+0

您在基因表的列標題被定義爲UNIQUE(或PRIMARY KEY),所以嘗試在SQLite數據庫中刪除這個約束條件 – 2013-03-05 22:34:09

+0

這樣做會增加一個雙重條目(2個header1條目): 標題序列 ------ ---- ---------- header1 AAAAA header1 AAAAAAAA header2 BBBBB – Stephen 2013-03-05 22:42:51

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; 

     } 

更新:,最後加入$ dbh->做while循環之後得到的最後一個記錄。

相關問題