2013-04-24 2 views
0

이것은 내 상황이 어떻게 생겼는지입니다. 나는 두 개의 테이블을 가지고있다 :중복 값 병합 및 테이블 간의 복사

Table 1 

C0 C1 C2 C3 ... C8 
    1      10 
    2      50 
    3      70 
    3      20 

Table 2 

C0 C1 C2 C3 ... C7 
    1      
    2      
    3      

Table 2 should become like this 

C0 C1 C2 C3 ... C7 
    1      x = 10 
    2      x = 50 
    3      x = 70,20 

기본적으로 두 테이블의 C1 값을 비교한다. 값이 같으면 C8 (표 1)의 값을 C7 (표 2)에 복사하고 "x ="를 추가해야합니다. 그러나 C1 (table1)에 중복 값이있는 경우 여기 3과 같이 표 2에서이 값을 ','(x = 70,20와 같이)로 구분하여 넣어야합니다.

이 내가이 모두 정확하면 지금까지

my $table1 = $ARGV[0]; 
my $table2 = $ARGV[1]; 

# Open my file (I use exactly the same code for opening table 2) 
unless ($table1) { 
    print "Enter filename of file:\n"; 
    $table1 = <STDIN>; 
    chomp $table1; 
    } 
open(DATA1,'<',$table1) or die "Could not open file $filename $!"; 

# Here I push the values of C8 in table 1 to the same row 
my %info =()  
while (<DATA1>) { 
    my @columns = split; 
if(exists $info{ $columns[1] }) { 
    push @{ $info{ $columns[1] }->{var} }, $columns[8]; 
} 
else { 
    $info{ $columns[1] } = { var =>[ $columns[8] ] } 
} 
} 

, 지금해야 할 유일한 것은 C7 (표 2)에 값을 복사하여이 "X ="

시작하도록하는 것입니다 무슨이다

누군가 나를 도와 줄 수 있습니까?

+0

를 작동하는 방법에 대한 자세한 내용은 perldoc perldscperldoc perllol를 참조하십시오? –

+2

Sugeestions :'use strict;를 사용하십시오. 지원을 사용; 또한 bareword 파일 핸들 (DATA1)을 피하십시오. 스칼라 변수를 파일 핸들로 사용하십시오. –

+1

'$ info'의 구조를 설명 할 수 있습니까? –

답변

1

나는 이것이 당신이 요구하는 것이라고 생각합니다. 확실히 PERL이 도움을 수있는 몇 가지 CSV 모듈을 가지고 %의 T1의 @line에 대한 액세스는 모든 언어의

use strict; 
use warnings; 

my $table1 = $ARGV[0]; 
my $table2 = $ARGV[1]; 

open(my $fh1,$table1) || die "$! $table1"; 
open(my $fh2,$table2) || die "$! $table1"; 

#discard the first lines which are the headers 
my $headers1=<$fh1>; 
my $headers2=<$fh2>; 

#set up data from table1 
my %t1=(); 
while(<$fh1>) { 
    chomp; #remove newlines 
    my @line=split(/\t/); #split on tabs 
    my $keyfield=$line[1]; #key is C1 
    push @{$t1{$keyfield}}, $line[8]; 
} 

#read from table2 and write output 
while(<$fh2>) { 
    chomp; #remove newlines 
    my @line=split(/\t/); #split on tabs 
    my $keyfield=$line[1]; #key is C1 
    my @x=(); 
    if (exists($t1{$keyfield})) { 
     push @x,@{$t1{$keyfield}}; # get the C8 values from t1 
    } 
    for my $c (0..6) { 
     print $line[$c],"\t"; #print C0 to C6 with a tab seperator 
    } 
    print "x = ",join(",",@x),"\n"; #do x=70,20 
} 
+0

정보를 제공해 주셔서 감사합니다. 이미 많은 도움이되었습니다. 그러나 내가 원하는 것을 정확하게하지는 않습니다. 선이 고유하면이 예제에서 1 행에 대해이 "x =., 10"을 인쇄합니다. "x = 10"을 인쇄해야합니다. 이게 어디 있는지 모르겠다. " 에서 온다 ... – user1987607

+1

나는 당신이 table2에서 데이터로 점을 읽고, table2에 C7 위치를 추측한다. 이것은 $ x [0]을 '.'로 설정합니다. 조인이이를 인쇄합니다. table2의 C7에서 데이터를 사용하지 않는다면 @x를 다음과 같이 빈리스트로 변경하십시오. "my @ x = $ line [7]; # C7 from t2''는''my @x =();''이 도움이되기를 바랍니다. 이 대답을 수락하면 좋을 것입니다 ... – Vorsprung

+0

고마워 이것이이 문제를 해결했습니다. 여전히 다른 것이 있습니다. 참여가 효과가없는 것으로 보입니다. 필자의 예제에서 3 번째 행에 대해서는 x = 70,20 대신에 x = 20으로 출력됩니다. 그래서 그는 그가 처음 말한 것을 고려하여 첫 번째 중복 줄을 잊어 버린 것처럼 보입니다. – user1987607

0

배열 참조를 문자열로 매핑하려고합니다! $string에서 무엇 당신이 할 수있는

,

  1. 복사 배열의 데이터입니다.
  2. $string$string = "x = $string";으로 연결하십시오.
  3. 대신이 수정 된 $string을 해시 (%info)에 할당합니다. Sice는 모두 스칼라이므로 과제가 문제가되지 않아야합니다.
+0

제 스크립트에서 어떻게 & 어떻게해야합니까? – user1987607