你好Perl专家,
我很抱歉,如果我问得太多,但是刚开始学习perl,并希望了解更多有关散列到csv的信息。试着打破我的头几天,但没有得到太多。 我的要求是我要转换下面的文件&不使用cpan中的自定义模块将其打印为csv。由于此处不允许使用自定义模块。
我尝试的逻辑是将输入文件放入哈希并像csv一样打印。 第一个问题我的代码有问题。 我有一个复杂的部分,我需要在空格之前使用第一个关键字进行搜索,如果我找不到它,需要添加一个'(空格)。例如。 ovpa_type不存在于第二个中。 像这样,文件中有5L行。
我想学习如何在hashhell中添加行,就像powershell一样。并且在我想要的时候转换成csv。
我的输入文件包含以下数据。
begin node
name ccaita23.contoso.com
on_off on
group SYSTEM_PING_UNIX
suppress no
auto_delete yes
read_community public
write_community public
address 2.1.52.36
port 161
ovpa_type router
trace off
snmp_version 1
engineid 0
auth_protocol 1
is_key_ok 0
error_status 0
security_level 0
v3_user 0
priv_protocol 0
end node
begin node
name ccaidi7c.contoso.com
on_off on
group SYSTEM_PING_UNIX
suppress no
auto_delete yes
read_community public
write_community public
address 1.1.210.76
port 161
trace off
snmp_version 1
engineid 0
auth_protocol 1
is_key_ok 0
error_status 0
security_level 0
v3_user 0
priv_protocol 0
end node
需要输出 ccaita23.contoso.com上,SYSTEM_PING_UNIX,没有,是的,公共的,公开的,2.11.52.36,161,路由器关闭,1,0,1,0,0,0,0,0 ccaidi7c.contoso.com,上,SYSTEM_PING_UNIX,否,是,公共,公共,1.1.210.76,161,关,1,0,1,0,0,0,0,0
open FILE1, "File.node" or die;
my %hash;
while (my $line=<FILE1>) {
chomp($line);
(my $key,my $value) = split / /, $line;
$hash{$key} .= $value;
}
my $name = $hash{'name'};
my $group = $hash{'group'};
my $csv = "$name,$group\n";
print $csv;
答案 0 :(得分:0)
my @fields = qw(
name on_off group suppress auto_delete read_community write_community
address port ovpa_type trace snmp_version engineid auth_protocol
is_key_ok error_status security_level v3_user priv_protocol
);
open my $FILE1, "<", "File.node" or die $!;
local $/ = ""; # paragraph reading mode/reads whole node at once
while (my $rec = <$FILE1>) {
# $rec =~ s/(?:begin|end)\s+node//g; # get rid of begin/end
my %hash = split ' ', $rec; # split node on spaces and feed into hash, in key/value fashion
# get hash slice for @fields keys, map every undef to "", so join wont warn under warnings
print join(",", map { $_ // "" } @hash{@fields}), "\n";
}