Regex Perl:基于空行分割文件以进行处理

Regex Perl:基于空行分割文件以进行处理,regex,perl,parsing,Regex,Perl,Parsing,我有一个有规则模式的数据文件,我需要从中提取信息。 每个部分用一个空行分隔。 因此,我想知道是否可以将文件拆分为空白行进行处理 为了更好地解释我的问题,让我分享一下示例结构: Block: A1 ----------------------------------- Height: 24.00 Width: 0.79 Depth: 0.04 --

我有一个有规则模式的数据文件,我需要从中提取信息。 每个部分用一个空行分隔。 因此,我想知道是否可以将文件拆分为空白行进行处理

为了更好地解释我的问题,让我分享一下示例结构:

 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

如有任何建议/线索,将不胜感激

使用“段落模式”在空白行中分割文件以进行处理很容易

local$/=”;
while(my$block=){
...
}
但不这样做更容易

my $block;
my $data;
while (<>) {
   if (/^Block:\s*(\S+)/) {
      $block = $1;
   }
   elsif (/^(\S+):\s*(\S+)/) {
      $data{$1}{$block} = $2;
   }
}
my$block;
我的$数据;
而(){
如果(/^Block:\s*(\s+/){
$block=$1;
}
elsif(/^(\S+):\S*(\S+/){
$data{$1}{$block}=$2;
}
}

使用“段落模式”在空白行中分割文件以进行处理很容易

local$/=”;
while(my$block=){
...
}
但不这样做更容易

my $block;
my $data;
while (<>) {
   if (/^Block:\s*(\S+)/) {
      $block = $1;
   }
   elsif (/^(\S+):\s*(\S+)/) {
      $data{$1}{$block} = $2;
   }
}
my$block;
我的$数据;
而(){
如果(/^Block:\s*(\s+/){
$block=$1;
}
elsif(/^(\S+):\S*(\S+/){
$data{$1}{$block}=$2;
}
}

使用“段落模式”在空白行中分割文件以进行处理很容易

local$/=”;
while(my$block=){
...
}
但不这样做更容易

my $block;
my $data;
while (<>) {
   if (/^Block:\s*(\S+)/) {
      $block = $1;
   }
   elsif (/^(\S+):\s*(\S+)/) {
      $data{$1}{$block} = $2;
   }
}
my$block;
我的$数据;
而(){
如果(/^Block:\s*(\s+/){
$block=$1;
}
elsif(/^(\S+):\S*(\S+/){
$data{$1}{$block}=$2;
}
}

使用“段落模式”在空白行中分割文件以进行处理很容易

local$/=”;
while(my$block=){
...
}
但不这样做更容易

my $block;
my $data;
while (<>) {
   if (/^Block:\s*(\S+)/) {
      $block = $1;
   }
   elsif (/^(\S+):\s*(\S+)/) {
      $data{$1}{$block} = $2;
   }
}
my$block;
我的$数据;
而(){
如果(/^Block:\s*(\s+/){
$block=$1;
}
elsif(/^(\S+):\S*(\S+/){
$data{$1}{$block}=$2;
}
}
while()
{
如果(/Block:\s*(\s*)/),则按@B$1;
如果(/Height:\s*(\s*)/),则按@H,$1;
如果(/Width:\s*(\s*)/),则按@W,$1;
如果(/Depth:\s*(\s*)/),则按@D$1;
}
打印“\t\t@B\n”;
打印“高度@H\n”;
打印“宽度@W\n”;
打印“Depth@D\n”;
测试
while()
{
如果(/Block:\s*(\s*)/),则按@B$1;
如果(/Height:\s*(\s*)/),则按@H,$1;
如果(/Width:\s*(\s*)/),则按@W,$1;
如果(/Depth:\s*(\s*)/),则按@D$1;
}
打印“\t\t@B\n”;
打印“高度@H\n”;
打印“宽度@W\n”;
打印“Depth@D\n”;
测试
while()
{
如果(/Block:\s*(\s*)/),则按@B$1;
如果(/Height:\s*(\s*)/),则按@H,$1;
如果(/Width:\s*(\s*)/),则按@W,$1;
如果(/Depth:\s*(\s*)/),则按@D$1;
}
打印“\t\t@B\n”;
打印“高度@H\n”;
打印“宽度@W\n”;
打印“Depth@D\n”;
测试
while()
{
如果(/Block:\s*(\s*)/),则按@B$1;
如果(/Height:\s*(\s*)/),则按@H,$1;
如果(/Width:\s*(\s*)/),则按@W,$1;
如果(/Depth:\s*(\s*)/),则按@D$1;
}
打印“\t\t@B\n”;
打印“高度@H\n”;
打印“宽度@W\n”;
打印“Depth@D\n”;
测试