使用 Perl 将以下结果文件格式化为表格格式

format the following result file into a tabular format using Perl

我有点问题,我还是 Perl 的新手。

我只想问一下如何将以下结果文件格式化为 Excel 可读格式(假设为 CSV)。

结果文件示例。 llq1_dly.mt0

$MEAS COMMANDS SOURCE='llq1_dly.meas' DB FILE='clk_top_45h_lpe_sim.fsdb'
.TITLE '**-------------'
    tdrll10_0        tdfll10_0        tdrll10_1        tdfll10_1        tdrll10_2        tdfll10_2        tdrll10_3
 2.106560e-10     1.990381e-10     2.102583e-10     1.986280e-10     2.095036e-10     1.978480e-10     2.083813e-10

进入以下文件,结果如下所示

llq1_dly,tdr,tdf,
ll10_0,2.106560e-10,1.990381e-10,
ll10_1,2.102583e-10,1.986280e-10,
ll10_2,2.095036e-10,1.978480e-10,
ll10_3,2.083813e-10,1.967019e-10,
...

或更可能是这个(与工程科学记数法兼容):

llq1_dly,tdr,tdf,
ll10_0,210.6560e-12,199.0381e-12,
ll10_1,210.2583e-12,198.6280e-12,
ll10_2,209.5036e-12,197.8480e-12,
ll10_3,208.3813e-12,196.7019e-12,
...

这是一个可以产生您要求的输出的程序。我通常不赞成为 OP 没有尝试自己编写解决方案的问题提供答案,但这个问题让我感兴趣。

很可能这可以写得更简单,但你没有说输入的哪些部分是不变的。例如,我编写它以便可以有任意数量的任意名称的不同列,而不是每次都只有 tdrtdf。事实上,我不得不猜测每个 header 的结尾部分都以 ll 结尾,因此例如 tdrll10_0tdrll10_0。如果那是错误的,那么您将需要一种不同的方式来拆分字符串。

我编写的程序可以从 DATA 文件句柄中读取。我相信您能够编写一个 open 语句来从正确的输入文件中读取?

希望对您有所帮助

use strict;
use warnings;
use 5.010;

use Number::FormatEng 'format_eng';
Number::FormatEng::use_e_zero();

my $fh = \*DATA;

my ($source, @headers, @values);
while ( <$fh> ) {
  if ( /SOURCE=(?|'([^']+)'|"([^"]+)")/ ) { #' code highlighting fix
    ($source = ) =~ s/\.[^.]*\z//;
  }
  elsif ( /^\.TITLE/ ) {
    @headers = split ' ', <$fh>;
    @values  = split ' ', <$fh>;
    last;
  }
}

my @title = ( $source );
my (%headers, @table, @line);
for my $i ( 0 .. $#headers) {
  my @fields = split /(?=ll)/, $headers[$i];
  if ( $headers{$fields[0]} ) {
    push @table, [ @line ];
    @line = ();
    %headers = ();
  }
  ++$headers{$fields[0]};
  push @line, $fields[1] if @line == 0;
  push @line, format_eng($values[$i]);
  push @title, $fields[0] unless @table;
}
print "$_," for @title;
print "\n";

for ( @table ) {
  print "$_," for @$_;
  print "\n";
}

__DATA__
$MEAS COMMANDS SOURCE='llq1_dly.meas' DB FILE='clk_top_45h_lpe_sim.fsdb'
.TITLE '**-------------'
    tdrll10_0        tdfll10_0        tdrll10_1        tdfll10_1        tdrll10_2        tdfll10_2        tdrll10_3
 2.106560e-10     1.990381e-10     2.102583e-10     1.986280e-10     2.095036e-10     1.978480e-10     2.083813e-10

输出

llq1_dly,tdr,tdf,
ll10_0,210.656e-12,199.0381e-12,
ll10_1,210.2583e-12,198.628e-12,
ll10_2,209.5036e-12,197.848e-12,