Улучшение моего файлового алгоритма ввода / вывода - PullRequest
2 голосов
/ 09 июня 2009

Для заданного набора текстовых файлов мне нужно найти каждый символ "\" и заменить его на "\\". Это система Windows, и у меня есть варианты языка сценариев: Javascript, VBScript или Perl.

Эти файлы довольно большие (~ 10 МБ за штуку), и их довольно много (~ 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 в этом случае?

Ответы [ 5 ]

4 голосов
/ 09 июня 2009

Вы не можете сделать это на месте, но обычно лучше читать данные порциями, чем читать по одному значению за раз. Прочитайте кусок, а затем переберите его. Чтение другого чанка и т. Д. До тех пор, пока «чанк» не будет иметь длину 0 или, тем не менее, вызов Read указывает на конец потока. (На большинстве платформ вызов Read может указывать на то, что вместо необходимости вызывать отдельную функцию AtEndOfStream.)

Кроме того, я не удивлюсь, если Perl сможет сделать это в одной строке. Или используйте sed, если можете:)

3 голосов
/ 09 июня 2009
perl -spi.og -e 's/\\/\\\\/gm' infile

Оставит вас переписанным infile и infile.og в качестве вашей резервной копии.

3 голосов
/ 09 июня 2009

Я бы предложил читать и писать большие куски (будь то строки или большое количество байтов). Это должно сократить количество операций ввода-вывода, которые вам нужно сделать, и позволить вам работать быстрее. Однако ваши файлы могут быть слишком большими, чтобы легко манипулировать ими в памяти. Играйте с размерами чтения / записи и посмотрите, что для вас быстрее.

2 голосов
/ 09 июня 2009

Это задача, для которой построен Perl , и она почти наверняка будет быстрее, но только если вы уже знакомы с языком. При этом вы можете легко настроить свой код JavaScript, читая в большем буфере и выполняя замену регулярным выражением. Взгляните на метод String.replace .

0 голосов
/ 09 июня 2009

Как сказал Джон, Perl может быть хорошим выбором.
Если вы можете, используйте Cygwin (который, я думаю, имеет инструменты, необходимые для такой вещи).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...