2014-02-04 2 views
0

У меня есть файл данных, который имеет обычный шаблон, из которого мне нужно извлечь информацию. Каждый раздел разделен пустой строкой. Следовательно, мне было интересно, могу ли я разбить файл на обработку в пустых строках.Perl: Разделить файл на пустые строки для обработки

Чтобы лучше объяснить мою проблему, позвольте мне поделиться структуру образца:

Block: A1 
----------------------------------- 
Height:      24.00 
Width:       0.79 
Depth:       0.04 
----------------------------------- 

Block: A2 
----------------------------------- 
Height:      20.00 
Width:       1.00 
Depth:       0.54 
----------------------------------- 

Block: B1 
----------------------------------- 
Height:      4.00 
Width:       4.50 
Depth:       0.87 
----------------------------------- 

В этой базе данных мне нужно упростить отчет, сделав несколько столбцов. Алгоритм, который я пытаюсь достичь, состоит в том, что если я могу разделить файл на более мелкие разделы на основе пустых строк, я мог бы прочитать базу данных в двухмерном массиве и, наконец, выгрузить данные в формат по своему выбору. Следовательно, первым требованием является обязательство в случае, если я могу разделить файл на пустые строки для дальнейшей обработки.

Мой ожидается окончательный результат

   A1  A2  B1 
Height:  24.00 20.00 4.00 
Width:  1.00 4.00 4.50 
Depth:  0.04 0.54 0.87 

Любые предложения/подсказки будут оценены.

ответ

3

Легко разделить файл на обработку в пустых строках, используя «режим абзаца».

local $/ = ""; 
while (my $block = <>) { 
    ... 
} 

Но это проще не делать.

my $block; 
my $data; 
while (<>) { 
    if (/^Block:\s*(\S+)/) { 
     $block = $1; 
    } 
    elsif (/^(\S+):\s*(\S+)/) { 
     $data{$1}{$block} = $2; 
    } 
} 
0
while(<>) 
{ 
push @B,$1 if(/Block:\s*(\S*)/); 
push @H,$1 if(/Height:\s*(\S*)/); 
push @W,$1 if(/Width:\s*(\S*)/); 
push @D,$1 if(/Depth:\s*(\S*)/); 
} 

print "\t\t @B \n"; 
print "Height @H \n"; 
print "Width @W \n"; 
print "Depth @D \n"; 

Испытано Here

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