2014-01-10 1 views
0

하나이지만 매우 긴 열을 포함하는 파일을 열려고합니다. 나는 그저 짧은 세그먼트를 검색하고, 지정된 라인에서 시작하여 다른 지정된 라인에서 끝내기를 원한다. 현재 스크립트는 원하는 줄이 발견 될 때까지 줄 단위로 파일을 읽습니다. 내가 사용하고 있습니다 :Perl을 사용하여 한 줄씩 파일을 읽는 대신 파일의 한 줄로 "점프"하는 방법

A 
G 
T 
C 
A 
G 
T 
C 
. 
. 
. 

어떻게 내가되고 싶은 곳으로 "점프"수 있습니다

my ($from, $to) = (some line number, some larger line number);  
my $count = 1; 
my @seq =(); 

while (<SEQUENCE>) { 
    print "$_ for $count\n"; 
    $count++; 

    while ($count >= $from && $count <= $to) { 
     push(@seq, $_); 
     last; 
    } 
} 
print "seq is: @seq\n"; 

입력처럼 보인다?

답변

2

seek을 사용하여 파일의 올바른 부분으로 이동해야합니다. ref : http://perldoc.perl.org/functions/seek.html

이것은 라인이 아닌 바이트에서 작동하므로 일반적으로 옵션이 아닌 라인 찾기를 사용해야하는 경우에 유용합니다. 그러나 고정 된 길이의 행 (플랫폼의 EOL 인코딩에 따라 2 또는 3 바이트)으로 작업하기 때문에 원하는 길이의 행 (0으로 인덱싱 된 행)을 곱하면 읽을 수있는 정확한 위치에있게됩니다 .

2

모든 행의 길이가 정확히 같음을 알게되면 (행 끝 문자를 고려하면 일반적으로 Unix/Linux에서는 1 바이트, Windows에서는 2 바이트) seek을 사용하면 지정한 지점으로 직접 이동할 수 있습니다 파일에서

seek 기능을 사용하면 줄이 아닌 바이트/문자로 파일 위치를 지정할 수 있습니다. 일반적인 경우 지정된 행 번호로 이동하는 유일한 방법은 처음부터 읽고 해당 행을 건너 뛰고 (1을 뺀) 것입니다.

줄 번호를 바이트 오프셋으로 매핑하는 색인이 없으면; 인덱스에서 지정된 행 번호를 검색하고 seek을 사용하여 해당 위치로 이동할 수 있습니다. 이렇게하려면 색인을 별도로 작성해야하며 (전체 파일을 읽어야하는 프로세스) 색인이 항상 최신 상태인지 확인해야합니다. 파일이 자주 변경되면 비실용적입니다.

필자는 그러한 색인을 작성하고 사용하기위한 기존 도구에 대해서는 알지 못하지만, 존재한다면 나는 놀라지 않을 것입니다. 그러나 자신의 것을 굴리기는 쉽습니다.

그러나 원하는 줄 번호를 찾기 위해 파일을 검색하지 않으면 성능상의 병목 현상이 심합니다. 추가 복잡성을 걱정하지 않아도됩니다.

+0

줄'<>'을 통해 줄을 빠르게 할 방법이 없다고 생각합니까? – ES55

+2

@ ES55 : Perl 개발자가 만들 수있는만큼 빨리 진행될 것으로 기대합니다. 적어도 유닉스와 윈도우 같은 시스템에서는 텍스트 파일이 무작위로 라인 어 드레서 블하지 않습니다. 고정 길이 행을 시행하거나 2 진 형식으로 전환 할 수있는 경우, 임의의 레코드를 페치 할 수 있습니다. 또는 어떤 종류의 데이터베이스로 전환하는 것을 고려할 수도 있습니다. 모든 작업은 수행하려는 작업과 변경 빈도에 비해 파일에 액세스해야하는 횟수에 따라 다릅니다. –

+0

나는 유닉스와 비슷한 맥을 사용한다. 파일은 염색체 서열이며 빈번하게 변하지는 않지만 자주 액세스됩니다. 'seek' 명령은 지금까지 매우 빠르게 작동합니다. 내가하고있는 일을 할 수있는 데이터베이스와 소프트웨어가있을 것이라고 확신하지만, 프로그래밍에 대해 배우는 과정이 끝날 무렵에는 휠 또는 두 가지를 재발 명하는 데 신경 쓰지 않습니다. – ES55

관련 문제