2009-06-09 31 views
2

對於給定的一組文本文件,我需要找到每個「\」字符並將其替換爲「\\」。這是一個Windows系統,我的腳本語言選項是Javascript,VBScript或Perl。改進我的文件輸入/輸出算法

這些文件很大(〜10MB一塊),並且有很多(〜15,000)。我已經想出了以下Javascript:

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

像喬恩說的那樣,Perl可能是不錯的選擇。
如果可以的話,使用cygwin(我認爲它有這種東西所需的工具)。

3

我建議讀取和寫入更大的塊(無論是行還是大量的字節)。這應該減少你需要做的IO,並讓你運行得更快。但是,您的文件可能太大,無法一起在內存中輕鬆操作。閱讀/寫入大小,並看看你最快的。

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

將離開你infile重寫和infile.og作爲你的備份。

2

這是Perl的構建任務,它幾乎肯定會更快,但前提是您已熟悉該語言。這就是說,你可以輕鬆地調整你的JavaScript代碼,通過閱讀更大的緩衝區,並用正則表達式替換。看看String.replace方法。