Улучшение моего алгоритма ввода-вывода файлов

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

Эти файлы довольно большие (~ 10МБ за штуку), и их довольно много (~ 15000). Я уже придумал следующий 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?


person Odrade    schedule 09.06.2009    source источник


Ответы (5)


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

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

person Jon Skeet    schedule 09.06.2009

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

person C. Ross    schedule 09.06.2009

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

Вы оставите переписанный файл infile и файл infile.og в качестве резервной копии.

person Beau Simensen    schedule 09.06.2009

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

person jiggy    schedule 09.06.2009

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

person shahkalpeshp    schedule 09.06.2009