我有一个问题,我仍然是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,
...
答案 0 :(得分:0)
这是一个产生你要求的输出的程序。我一般不赞成提供OP自己没有尝试过编写解决方案的问题的答案,但这个问题让我感兴趣。
这可能更简单,但你不能说输入的哪些部分是不变的。例如,我编写了它,以便可以有任意数量的具有任何名称的不同列,而不是每次只有tdr
和tdf
。因为我不得不猜测每个标题的尾随部分以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 = $1) =~ 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,