2009-06-09 2 views
2

주어진 텍스트 파일의 경우 모든 "\"문자를 찾아 "\\"으로 바꿔야합니다. 이것은 Windows 시스템이며 스크립팅 언어 옵션은 Javascript, VBScript 또는 Perl입니다.내 파일 I/O 알고리즘 개선

이 파일은 크기가 큽니다 (~ 10MB 한 장)이며 좋은 수 (~ 15,000 개)가 있습니다. 이미 다음 자바 스크립트를 제안했습니다.

function EscapeSlashes(inFilePath) 
{ 
    var readOnly = 1; 
    var fso = WScript.CreateObject("Scripting.FileSystemObject"); 
    var outFile = fso.CreateTextFile(inFilePath + "escaped.js", true); 
    var inFile = fso.OpenTextFile(inFilePath, readOnly); 

    var currChar; 
    while(!inFile.AtEndOfStream) 
    { 
     currChar = inFile.Read(1); 

     //check for single backslash 
     if(currChar != "\\") 
     { 
      outFile.Write(currChar); 
     } 
     else 
     { 
      //write out a double backslash 
      outFile.Write("\\\\"); 
     } 
    } 

    outFile.Close(); 
    inFile.Close(); 
} 

위의 내용이 다소 느릴 수도 있습니다. 알고리즘을 개선 할 방법이 있습니까? 한 캐릭터를 두 캐릭터로 대체 할 것이기 때문에,이 캐릭터가 제자리에서 수행 될 수 있다고 생각하지 않습니다.

문자 단위가 아닌 줄 단위로 읽는 것이 성능면에서 유리합니까?

Perl 또는 VBScript는이 경우 Javascript보다 이점이 있습니까?

답변

4

보통은 할 수 없지만 한 번에 하나의 값을 읽는 대신 데이터를 청크로 읽는 것이 좋습니다. 청크를 읽은 다음 청크를 반복합니다. "청크"길이가 0이 될 때까지 다른 청크 등을 읽습니다. 그러나 Read 호출은 스트림의 끝을 나타냅니다. (대부분의 플랫폼에서 Read를 호출하면 별도의 AtEndOfStream 함수를 호출 할 필요가 없다는 것을 알 수 있습니다.)

또한 Perl이 한 줄에서이 작업을 수행 할 수 있다면 놀랄 일도 아닙니다. 또는 가능한 경우 sed을 사용하십시오.

0

Jon이 말했듯이 Perl이 좋은 선택 일 수 있습니다.
할 수 있으면 cygwin을 사용하십시오. (그런 것들을 위해 필요한 도구가 있다고 생각합니다.)

3

더 큰 청크를 읽거나 쓰는 것이 좋습니다 (선 또는 많은 바이트 수). 이렇게하면 필요한 IO를 줄이고 더 빨리 실행할 수 있습니다. 그러나 파일이 너무 커서 메모리에서 쉽게 조작 할 수는 없습니다. 읽기/쓰기 크기로 플레이하고 가장 빠른 것을보십시오.

3
perl -spi.og -e 's/\\/\\\\/gm' infile 

백업본을 infile.og로 다시 작성하십시오.

2

이것은 Perl이 구축 한 작업의 일종이며 이미 언어에 익숙한 경우에만 거의 확실하지만 더 빠를 것입니다. 즉, 더 큰 버퍼를 읽고 정규식으로 대체하여 JavaScript 코드를 쉽게 조정할 수 있습니다. String.replace 메소드를 살펴보십시오.

관련 문제