2013-12-17 10 views
0

У меня есть файл дампа базы данных. Терминатор поля «\ t | \ t». Я пытаюсь получить первые 2 поля (TAX_ID и родительский TAX_ID), используя этот код:Файл дампа базы данных Parsing в Perl

код:

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. Любые идеи почему? Есть ли лучший способ очистить каждое значение из полей

+0

Если \ t является разделителем, почему вы используете метасимвол «^»? –

+0

«\ t | \ t» является разделителем. Я попытался разделить каждую строку без раскола успеха («\ t | \ t», $ line), поэтому я разбиваю на | только затем пытаясь очистить вкладки. – user2674514

ответ

0

Split на полном разделителем, а не просто ее часть:

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

Тогда нет никакой необходимости, чтобы очистить ваши данные послесловие.

+0

Символ трубы должен быть экранирован. – mob

+0

Я пробовал разделить полный разделитель «\ t | \ t» и, похоже, разбился на первой вкладке и не работает. – user2674514

+0

Я также пробовал «\ t \ | \ t» без успеха. – user2674514

0

Если вы идете с вашим текущим решением, вы хотите протолкнуть метасимвол «^», что означает «начинается с».

Вы хотите

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

Ex.

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

Выход:

| Hi | 
|Hi| 
+0

Это работает для $ taxid, но не очищает $ parentid. – user2674514

+0

Тогда это не вкладки. Вы можете сделать пробелы, если хотите, т. Е. \ S вместо \ t, чтобы увидеть, не являются ли эти табы. –

+0

Я избавился от^и & в моей функции замены и, похоже, работает для обеих переменных $ taxid и $ parentid. Спасибо. – user2674514

0

Попробуйте использовать общий пробельные матч символов:

$taxid =~ s/^\s*$//g; 
$parentid =~ s/^\s*$//g; 
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"; 

} 

Этот код может быть более конкретным, если вы предоставили образец необработанных данных.

Смежные вопросы