2014-09-04 3 views
0

제목이 그다지 설명이 유용하지 않을 수 있습니다. 설명해 드리죠 :다른 텍스트 파일에서 텍스트 파일의 인덱스를 가져 오는 중

내가 파일을 가지고 (말 1 파일) 몇 가지 숫자를 [A 공간으로 구분] . 내가 (말 2 파일) 몇 가지 숫자 [A 로 구분] 을 가진 다른 파일을 이곳

1 2 3 4 5 
1 2 8 4 5 6 7 
1 9 3 4 5 6 7 8 
..... n lines (length of each line varies). 

를 참조하십시오. I는 합계 원하는 라인

1 1 1 1 1 1 0 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 0 1 1 1 1 1 
1 1 1 1 1 1 0 1 1 1 1 1 
..... m lines (length of each line fixed). 

제가 1 2 3 4 5 번째 (파일 1 라인 1) 위치 파일 2 의 합계를 원하는 여기서 1
참조 1 2 3 4 5 6 7 (파일 1 라인 2) 위치는 파일 2, 라인 1은 등입니다.

open(FH1, "File1.txt"); 
@index = <FH1>; 
open(FH2, "File2.txt"); 
@matrix = <FH2>; 
open(OUTPUT, ">sum.txt"); 
foreach $xx (@matrix) { 
    @k1 = split(/\t/, "$xx"); 
    foreach $yy (@index) { 
     @k2 = split(/ /, "$yy"); 
     $ssum = 0; 
     foreach $zz (@k2) { 
      $zz1 = $zz - 1; 
      if ($k1[$zz1] == 1) { 
       $ssum++; 
      } 
     } 
     printf OUTPUT"$ssum\t"; 
     $ssum = 0; 
    } 
    print OUTPUT"\n"; 
} 
close FH1; 
close FH2; 
close OUTPUT; 

그것을 : 나는 다음과 같은 코드로 이런 짓을

5 6 6 …n columns (File 1) 
1 8 3 
9 8 4 
… m rows (File 2)   

:
내가 좋아하는 일
그것은 모양 위치 2 모든 라인 파일에 파일의 라인 방식의 합을 원하는 그것을 제외하고는 절대적으로 잘 작동하지만, 대용량 파일의 경우 시간 요구량이 엄청납니다.
내 데이터가 4 번이 예제를 초과 할 수 있습니다 시간은 팔분입니다 그리고 내 사용자에 대한 용납
어떻게 이러한 목표를 달성하기 위해, 훨씬 덜 소모 :. (예를 들어 1000 선은 1 X 25000 선이 두 파일 파일.. 시간. 또는 다른 개념이다.

답변

2

항상 모든 PERL 스크립트 use strict;use warnings; 등이 있습니다. 당신은 첫 번째 파일을 여러 번 처리하지 않음으로써 스크립트를 단순화 할 수

. 또한, 코딩 스타일은 매우 오래된 너 위트를 사용한다. h는 반음계로 Modern Perl Book에서 수업을받습니다.

다음은 좀 더 현대적인 스타일과 기법을 사용하기 위해 간략하게 작성된 스크립트입니다.

use strict; 
use warnings; 
use autodie; 

use List::Util qw(sum); 

my @indexes = do { 
    #open my $fh, '<', "File1.txt"; 
    open my $fh, '<', \ "1 2 3 4 5\n1 2 8 4 5 6 7\n1 9 3 4 5 6 7 8\n"; 
    map { [map {$_ - 1} split ' '] } <$fh> 
}; 

#open my $infh, '<', "File2.txt"; 
my $infh = \*DATA; 

#open my $outfh, '>', "sum.txt"; 
my $outfh = \*STDOUT; 

while (<$infh>) { 
    my @vals = split ' '; 

    print $outfh join(' ', map {sum(@vals[@$_])} @indexes), "\n"; 
} 

__DATA__ 
1 1 1 1 1 1 0 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 0 1 1 1 1 1 
1 1 1 1 1 1 0 1 1 1 1 1 

출력 : 그것은 현재 대신 외부 소스의 스크립트 내부에서 파일 데이터를로드하는 것을주의 주요 장점은 XS '이다

5 6 7 
5 7 8 
5 6 7 
5 6 7 
+0

내가 추측 손 foreach 문을 압연보다 더 빨리해야하는 sum' ,'split'은'@indexes '요소에 대해 여러 번 수행되지 않습니다. –

+0

Btw, do 블록 안에서'open'의 목적은 무엇입니까; $ fh 범위를 제한하고 자동으로 파일을 닫으시겠습니까? –

+0

그게 사실이 코드는 아마 읽을 수 있습니까? :) – Miller

관련 문제