在Perl中解析数​​据库转储文件

时间:2013-12-17 21:58:34

标签: perl

我有一个数据库转储文件。字段终止符是“\ t | \ t”。我正在尝试使用此代码获取前2个字段(tax_id和parent tax_id):

代码:

while(my $line = <INPUT>) {   
    my ($taxid, $parentid, $rank, $embl, $div, $inherdiv, $mito, $inhermito, $gbflag, $subtree, $comment)  = split (/\|/, $line);
    $taxid =~ s/^\t$//g;  
    $parentid =~ s/^\t$//g;
    print $taxid."_".$parentid."\n";
}

示例输出:

69223   _       204037
69224   _       551

当我使用替换函数s /// g时,似乎没有清理制表符分隔符。有什么想法吗?有没有更好的方法来清理字段中的每个值

4 个答案:

答案 0 :(得分:1)

我没有尝试手动解析这些东西,而是尝试使用Text :: CSV。

use Text::CSV;

my $csv->new({
    binary => 1,            # just always do this
    eol => "\n",            # end of line char
    sep_char => "|",        # separator
    allow_whitespace => 1   # Auto trim tabs and spaces when parsing
});

open my $fh, '<', $path_to_db_dump
    or die "Can't open $path_to_db_dump - $!\n";

my @headers = qw/
    taxid   parentid
    rank    embl
    div     inherdiv
    mito    inhermito
    gbflag  subtree
    comment
/;
$csv->column_names( @headers );

# skip to the place in the file where data lines live

while ( my $row = $csv->get line_hr($fh) ) {

    print "$row->{taxid}_$row->{parentid}\n";

}

如果您提供了原始数据样本,则此代码可能会更加具体。

答案 1 :(得分:0)

拆分完整的分隔符而不仅仅是其中的一部分:

my ($taxid, $parentid, $rank, $embl, $div, $inherdiv, $mito, $inhermito, $gbflag, $subtree, $comment)
    = split "\t\\|\t", $line;

然后没有必要在后面清理你的数据。

答案 2 :(得分:0)

如果使用当前的解决方案,您想要抛弃“^”元字符,这意味着“以...开头”。

你想要

$taxid =~ s/\t//g; 

实施例

my $str = "|\tHi\t|";
print "$str\n";
$str=~ s/\t//g;
print "$str\n";

输出:

|   Hi  |
|Hi|

答案 3 :(得分:0)

尝试使用一般的空白字符匹配:

$taxid =~ s/^\s*$//g;  
$parentid =~ s/^\s*$//g;