Perl文件,新行到HASH,然后到CSV

时间:2014-05-13 20:12:55

标签: perl csv hash

  

你好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;

1 个答案:

答案 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";
}