我有一组这样的CSV值:
device name, CPU value, frequency of CPU value, CPU in percentage
例如
router1,5,10,4
router1,5,1,5
router2,5,10,4
router2,5,2,5
router3,4,5,6
router3,7,6,5
我需要形成这样的数据结构:
array = {
router1 => [5,10,4],[5,1,5],
router2 => [5,10,4],[5,2,5],
router3 => [4,5,6],[7,6,5]
}
我需要帮助在Perl中构建这个数据结构。
我试过想象一下如何做到这一点,但我无法这样做。我很感激任何帮助。
我的最终目标是将其转换为JSON对象。
答案 0 :(得分:2)
这应该让你开始。它使用DATA
文件句柄,以便我可以将数据嵌入程序本身。我使用JSON
模块中的to_json
将哈希格式化为JSON数据。语句$_ += 0 for @values
将@values
的内容从字符串转换为数字,以避免生成的JSON数据中的引号。
use strict;
use warnings;
use JSON;
my %data;
while (<DATA>) {
chomp;
my ($device, @values) = split /,/;
$_ += 0 for @values;
push @{ $data{$device} }, \@values;
}
print to_json(\%data, { pretty => 1, canonical => 1 });
__DATA__
router1,5,10,4
router1,5,1,5
router2,5,10,4
router2,5,2,5
router3,4,5,6
router3,7,6,5
<强>输出强>
{
"router1" : [
[
5,
10,
4
],
[
5,
1,
5
]
],
"router2" : [
[
5,
10,
4
],
[
5,
2,
5
]
],
"router3" : [
[
4,
5,
6
],
[
7,
6,
5
]
]
}
答案 1 :(得分:0)
这是一个打印所需JSON对象的简单解决方案。
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;
my %hash;
while (my $line = <DATA>) {
chomp $line;
my ($device, @cpu_values) = split(/,/, $line);
my $cpu_token = join(",", @cpu_values);
$hash{$device} .= '[' . $cpu_token . '], ';
}
my @devices = keys %hash;
print "array = { \n";
foreach (sort @devices) {
print "$_ => [$hash{$_}]\n";
}
print "}\n";
__DATA__
router1,5,10,4
router1,5,1,5
router2,5,10,4
router2,5,2,5
router3,4,5,6
router3,7,6,5
答案 2 :(得分:0)
在Perl中,您需要以匿名数组和散列的方式使用引用来创建多维数组,数组数组,包含哈希值的哈希值以及介于两者之间的任何位置。 perlreftut应该涵盖如何完成你想要做的事情。这是我前几天写的一个例子,也可以帮助解释:
print "\nFun with multidimensional arrays\n";
my @myMultiArray = ([1,2,3],[1,2,3],[1,2,3]);
for my $a (@myMultiArray){
for my $b (@{$a}){
print "$b\n";
}
}
print "\nFun with multidimensional arrays containing hashes\nwhich contains an anonymous array\n";
my @myArrayFullOfHashes = (
{'this-key'=>'this-value','that-key'=>'that-value'},
{'this-array'=>[1,2,3], 'this-sub' => sub {return 'hi'}},
);
for my $a (@myArrayFullOfHashes){
for my $b (keys %{$a}){
if (ref $a->{$b} eq 'ARRAY'){
for my $c (@{$a->{$b}}){
print "$b.$c => $c\n";
}
} elsif ($a->{$b} =~ /^CODE/){
print "$b => ". $a->{$b}() . "\n";
} else {
print "$b => $a->{$b}\n";
}
}
}