2014-04-28 2 views
0

대용량 파일 (잠재적으로 1.5GB)에 매우 긴 행이있을 경우 대용 암호를 사용해야합니다. 나는 슬라이딩 윈도우를 실행하여 파일에서 12,4096 바이트를 가져다가 이전 청크에 추가하고 대체한다고 생각했지만, 물론 대체가 폴드 겹쳐 질 수있는 대체를 위해 그렇게 잘 작동하지 않습니다.대용량 파일에 대한 정규 표현식 대체

다른 생각으로는 처음 두 개의 청크부터 시작하여 s///을 시작할 수 있습니다. 대체가 없다면 chunk1을 디스크에 쓰고 chunk3을 붙입니다. 그렇다면 나는 s/// (청크 2와 청크 3)입니다. 하위가 있다면 chunk4를 붙잡아 추가합니다. 그런 다음 하위 항목이 없어 질 때까지 계속 추가합니다. 그 시점에서 나는 디스크에 최신 덩어리를 제외한 모든 것을 기록합니다. 좋아요 :

read($data, $previous_chunk, 4096); 
while(read($data, $this_chunk, 4096) > 0){ 
    my $chunk = $previous_chunk . $this_chunk; 
    if(0 == $chunk =~ s/foo/bar/g){ 
     # There was nothing to substitute, so we'll append all 
     # the old stuff to our file and just keep the latest chunk. 
     print OUTPUT $previous_chunk; 
     $previous_chunk = $this_chunk; 
    } 
    else { 
     # There was a substitution, so we want to keep building 
     # in case it crossed the fold 
     $previous_chunk .= $this_chunk; 
    } 
} 

정상적으로 들리니? 내가 볼 수있는 유일한 문제는 대체가 실행 중에 새로운 일치가 발생하면 $previous_chunk입니다. 따라서 우리는 대체적으로 최신 대체품까지 $previous_chunk을 지우고 그 뒤를 이어 깨끗한 콘텐츠 만 유지해야 할 것입니다. 예를 들어 우리가 s/foo/foobar/이라면 'foo'를 'foobar'로 바꾼 다음 'foobarbar'로 'foobarbarbar'로 바꿀 것입니다. 그것을 할 수있는 더 좋은 방법이 있는지

+0

메모리 용량은 얼마나 되나요? 전체 파일을 메모리로 읽어 들이고 대체를 수행하고 다시 쓸 수 있습니까? 그것은 큰 망치이지만, 당신의 목적을 위해 작동 할 수도 있습니다. –

+2

대체품의 특성에 따라 다릅니다. Greg가 지적했듯이 전체 파일을 메모리에로드하는 것이 가능할 수도 있습니다. 그러나 많은 사람들이 내부 라인 교체 만하기 때문에 수행중인 번역 유형에 따라 간단한 라인 단위 처리가 작동 할 수 있습니다. 결국 더 많은 조언을 할 수있는 더 많은 데이터가 필요합니다. – Miller

+0

얼마나 오래입니까? 귀하의 모든 대체물은 한 줄로 작업하기에 적합합니까? – ysth

답변

0

당신은 "더 나은"는 주관적이다. 질문, 그러나 이것은 내가 같은 문제에 직면한다면 내가 할 것 인 것이다.

한 옵션에 펄을 사용하지 않는 것입니다 거대한 파일을 지원하는 텍스트 편집기에서 찾기 및 바꾸기를 수행 할 수 있습니다.

Windows에서는 거대한 파일을 지원하는 EditPad Pro . 내 제품이 아니기 때문에 이것은 광고가 아닙니다. 나는 그것이 Regex-centric (RegexBuddy와 같은 저자)이기 때문에 EPP를 사용한다.

the brochure에서 인용 :이 전체 큰 파일 문제를 오프로드 할 수 있습니다 Open and edit files of absolutely any size, including files larger than 4 GB, even on a 32-bit system with a modest amount of RAM.

.

기타 관련 기능 : 정규 표현식을 저장하고, 매크로로 연결하고, 자신의 Perl 스크립트와 같은 도구를 호출하여 현재 열려있는 파일을 조작 할 수 있습니다. 다시 한번 외부 도구의 메모리 관리가 필요함).

+0

아니요, 손으로 편집 할 수있는 다양한 옵션이 있습니다. 이것은 중요한 데이터를 제거하는 SQL 덤프 sanitisation 스크립트입니다.의견에 솔루션 중 하나를 사용하고 줄 단위로 구문 분석 할 것입니다. – RickMeasham