2017-08-31 30 views
-1

我是perl的新手。我無法對列的數據進行非規範化處理,我如何將其歸一化。我有下面輸入perl中的數據連接不起作用

FieldA,FieldB,FieldC 

bc,A1,A 

bc,A2,A 

bc,Z,Z 

bc1,A,A 

bc1,Z1,Z 

bc1,Z2,Z 

bc2,A1,A 

bc2,A2,A 

bc2,Z1,Z 

bc2,Z2,Z 

需要的輸出如下

FieldA,FieldB,FieldC 

bc,A1#A2,Z 

bc1,A,Z1#Z2 

bc2,A1#A2,Z1#Z2 

我使用推送功能試過,但它不工作。請幫助解決這個問題。

my @aArray; 

my @zArray; 

while(<FILE_HANDLER>){ 

    chomp($_); 

    @arr = split(/,/$_); 

    $bc_name = $arr[0]; 

    $end = $arr[1]; 

    if($end eq $end_temp){ 

     push @aArray, $end; 

    }else{ 

     push @zArray,$end; 

    } 

    $end_temp = $end; 

} 
+0

你需要,你可以寫使用散列而不是數組。 – mkHun

+0

請檢查並修改:https://stackoverflow.com/help/mcve –

+1

你有什麼嘗試?你有什麼問題?請告訴我們你的代碼。如果你還沒有代碼,堆棧溢出不是你的問題的正確位置。 –

回答

1

使用哈希對於這種情況,使用bc,bc1,bc2值作爲密鑰,並與現有的哈希串聯值。

use warnings; 
use strict; 
my %h; 
scalar <DATA>; #removing first line 
while (<DATA>) 
{ 
    chomp; 
    my ($l,$r) = split(","); 
    $h{$l} .= "$r "; 

} 

print "$_ $h{$_}\n" foreach (keys %h) 


__DATA__ 
FieldA,FieldB 
bc,A1 
bc,A2 
bc,Z 
bc1,A 
bc1,Z1 
bc1,Z2 
bc2,A1 
bc2,A2 
bc2,Z1 
bc2,Z2 

有一個在你的腳本的幾個問題,

的第一件事是,你應該在你的每一個程序中使用use warningsuse strict

問題在你分裂功能,你錯過了,。這種情況使用哈希值,因爲如果我們需要一個數組,我們需要做更多的邏輯。


如果您使用的默認變量($_),使用波紋管代碼,而不是你的,

chomp($_);你可以寫爲chomp;

@arr = split(/,/$_);@arr = split(/,/);

+0

代碼沒有給出正確的結果 – tester

+0

@tester給出了什麼。 – mkHun