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

时间:2015-04-18 06:57:42

标签: string perl csv string-formatting

我有一个问题,我仍然是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,
...

1 个答案:

答案 0 :(得分:0)

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

这可能更简单,但你不能说输入的哪些部分是不变的。例如,我编写了它,以便可以有任意数量的具有任何名称的不同列,而不是每次只有tdrtdf。因为我不得不猜测每个标题的尾随部分以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 = $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,