s******a 发帖数: 184 | 1 我有两个Excel 文件,第一个文件存着下面这样的数据
12 A P1
23 B P5
24 C P2
15 D P1
06 E P5
第二个文件存着下面这样的数据
06 100
23 20
06 200
06 95
23 05
24 18
基于第一个文件, 我产生了下面这样的结构
$VAR1 = {
'P5' => {
'E' => '06',
'B' => '23'
},
'P2' => {
'C' => '24'
},
'P1' => {
'A' => '12',
'D' => '15'
}
};
我是这么做得
my %Var1;
for my $i (1 .. $row1)
{
# for simplicity, I just keep the main part to building this hash chain
$Var1{$column3}->{$column2} = {$column1};
}
这里 $column3 相应于p1, p2, etc; $column2 相应于E, B, etc ; $column1 相应
于06,23,24,etc.
我的问题是如何基于上面产生的结构生成下面的结构,
$VAR = {
'P5' => {
'E' => '06' => [100, 200, 95]
'B' => '23' => [20, 1000, 05, 30]
},
'P2' => {
'C' => '24' => [18, 23, 2300, 3456]
},
'P1' => {
'A' => '12' => [24, 25, 3200, 5668]
'D' => '15' => [168]
}
};
比如说,第二个文件的第一行是06 100, 如何在VAR1种找到06,并把100 和它联上。 | d****n 发帖数: 1637 | 2 先扫进第二个文件,以col 1 为 key ,然后push 每个value 到 key
push @{$hash{'06'}}, 100
push @{$hash{'06'}}, 200
你就有了 hash of array, like 06 =>[100, 200,50]
再扫第一个文件,当你用到
$VAR{$key1}{$key2}{$key3} 时候,
你就 assignment reference to
$VAR{'P5'}{'E'}{'06'}= \@{$hash{'06'}} ;
第二个文件 用 hash of array
第一个文件用 hash of hash of hash of reference
大致是这个样子,可能有语法问题。
顺便说下,你的结构够混乱的
太乱了。
我早就不用perl, 用python吧。
【在 s******a 的大作中提到】 : 我有两个Excel 文件,第一个文件存着下面这样的数据 : 12 A P1 : 23 B P5 : 24 C P2 : 15 D P1 : 06 E P5 : 第二个文件存着下面这样的数据 : 06 100 : 23 20 : 06 200
| w******p 发帖数: 166 | 3 $ cat file1 file 2 | perl -ne '@a=split; if(scalar @a==3){$h{$a[2]}{$a[1]}{$
a[0]}=[]; $h1{$a[0]}=[@a[2,1]]} else {if(exists $h1{$a[0]}){($p,$a)=@{$h1{$a
[0]}}; push @{$h{$p}{$a}{$a[0]}}, $a[1] }else{warn "no entry for found for $
_"}} END{use Data::Dumper; print Dumper(\%h)}'
$VAR1 = {
'P5' => {
'E' => {
'06' => [
'100',
'200',
'95'
]
},
'B' => {
'23' => [
'20',
'05'
]
}
},
'P2' => {
'C' => {
'24' => [
'18'
]
}
},
'P1' => {
'A' => {
'12' => []
},
'D' => {
'15' => []
}
}
}; | d****n 发帖数: 1637 | 4 牛人啊。都写一行。
不过这也是我为什么不爱用perl的原因。
{$
$a
$
【在 w******p 的大作中提到】 : $ cat file1 file 2 | perl -ne '@a=split; if(scalar @a==3){$h{$a[2]}{$a[1]}{$ : a[0]}=[]; $h1{$a[0]}=[@a[2,1]]} else {if(exists $h1{$a[0]}){($p,$a)=@{$h1{$a : [0]}}; push @{$h{$p}{$a}{$a[0]}}, $a[1] }else{warn "no entry for found for $ : _"}} END{use Data::Dumper; print Dumper(\%h)}' : $VAR1 = { : 'P5' => { : 'E' => { : '06' => [ : '100', : '200',
|
|