【问题标题】:How to organise an output file in perl?如何在 perl 中组织输出文件?
【发布时间】:2015-07-12 13:47:34
【问题描述】:

我用 perl 编写了一段代码。我得到了我想要的结果,但是,我希望我的输出按照 DATA 的顺序进行格式化。

#!/usr/bin/perl
use strict;
use warnings;
use autodie;
use List::Util 'any';

my $input_file = 'DATA.csv';
my (@headers, %docs);

open my $fh, '>',"fh.txt";

open(my $Fhresult, '<', $input_file);
while (<$Fhresult> ) {
    last if (/^\d+\s+\d{2}:\d{2}:\d{2}\s*$/);
}
while (<$Fhresult> ) {
    if ($. == 2) {
        chomp;
        s/^default,\s*//;
        @headers = split ( /[ ,. ;:\(\)\/\*\"]+/ );  
        next;
    }
    next unless /\S/;
    chomp;
    my ($file, @fields) = split /\s*,\s*|\s+/;
    $docs{$file} = [@fields] if any { $_ eq 'fault' } @fields;
    # ou bien? $docs{$file} = [@fields]; si on veut tout
}
close($Fhresult);

foreach my $doc (keys %docs) {
    print  "$doc:\n";
    foreach (0..$#headers) {
        printf ("%18s : %s\n", $headers[$_], $docs{$doc}->[$_]);
    }
    print  "\n";
}

_______________________数据_________________________________________

20150627 19:08:00
default, primary, secondary, copy_direct, forced_copy, always_allow, type_of_dump, full_memory,
d100spupt, /dev/lg_du, /dev/sysdu, /var/adm, 1, 1, fault, disallow,
doc10, 5, fault, 7, ad8, 9, wu, disallow,
doc11, 5, fault, 5g7, 8, te, 10, disallow,
doc12, 5, fault, 7, ca, 9hg, 10, disallow,
doc13, 5, fault, 7, 8, 35hg, 10, disallow,

输出文件:

文件1:

d100spupt:
               primary : /dev/lg_du
             secondary : /dev/sysdu
           copy_direct : /var/adm
           forced_copy : 1
          always_allow : 1
          type_of_dump : fault
           full_memory : disallow

文件2:

doc10:
               primary : 5
             secondary : fault
           copy_direct : 7
           forced_copy : ad8
          always_allow : 9
          type_of_dump : wu
           full_memory : disallow

文件3

doc11:
                   primary : 5
                 secondary : fault
               copy_direct : 5g7
               forced_copy : 8
              always_allow : te
              type_of_dump : 10
               full_memory : disallow
  • .
  • .
  • .

文件5:

doc13:
                       primary : 5
                     secondary : fault
                   copy_direct : 7
                   forced_copy : 8
                  always_allow : 35hg
                  type_of_dump : 10
                   full_memory : disallow

【问题讨论】:

  • 如果您每行写入一个文件,您可以为 data.csv 的每一行打开/写入/关闭一个文件,而不是将信息存储在 %docs 中并稍后创建文件。
  • 不幸的是,我不明白他们的意思。如果您查看 DATA,第一行是日期和时间,第二行以“默认”开头,然后开始处理 DATA 我希望它使每一行都在文件存储和文件中。所以我知道 file1 属于第 1 行,第 2 行属于 file2,等等。
  • 添加一个为每个文件递增的变量,并用它来命名输出文件。

标签: perl


【解决方案1】:

哈希没有顺序,所以当你用foreach 循环它们时,项目的顺序是不可预测的。

要保留订单,您需要一种解决方法。例如,您可以在构建时将散列的每个键附加到列表中。或者您可以使用Tie::IxHash 模块。

但是,您面临这种情况的事实揭示了一个概念问题,唯一的结论似乎是哈希在这里不合适。

一个哈希数组的例子:

my @headers;
my @docs;

...

    my ($file, @fields) = split /\s*,\s*|\s+/;
    push @docs, {'file'=>$file, 'fields'=>\@fields} if any { $_ eq 'fault' } @fields;
}

close($Fhresult);

foreach my $doc (@docs) {
    print  $doc->{'file'} , ":\n";
    foreach (0..$#headers) {
        printf ("%18s : %s\n", $headers[$_], $doc->{'fields'}[$_]);
    }
    print  "\n";
}

【讨论】:

    猜你喜欢
    • 2016-12-03
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 2011-07-31
    • 2016-04-07
    相关资源
    最近更新 更多