【发布时间】: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