使用 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 没有尝试自己编写解决方案的问题提供答案,但这个问题让我感兴趣。
很可能这可以写得更简单,但你没有说输入的哪些部分是不变的。例如,我编写它以便可以有任意数量的任意名称的不同列,而不是每次都只有 tdr
和 tdf
。事实上,我不得不猜测每个 header 的结尾部分都以 ll
结尾,因此例如 tdrll10_0
是 tdr
和 ll10_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,
我有点问题,我还是 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 没有尝试自己编写解决方案的问题提供答案,但这个问题让我感兴趣。
很可能这可以写得更简单,但你没有说输入的哪些部分是不变的。例如,我编写它以便可以有任意数量的任意名称的不同列,而不是每次都只有 tdr
和 tdf
。事实上,我不得不猜测每个 header 的结尾部分都以 ll
结尾,因此例如 tdrll10_0
是 tdr
和 ll10_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,