对于给定的一组文本文件,我需要找到每个“\
”字符并将其替换为“\\
”。这是一个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有任何优势?
答案 0 :(得分:4)
你不能这样做,但通常最好以块的形式读取数据,而不是一次读取一个值。读取一个块,然后遍历它。读取另一个块等 - 直到“块”的长度为0,或者对Read的调用指示流的结束。 (在大多数平台上,对Read的调用可以指示而不是必须调用单独的AtEndOfStream函数。)
另外,如果Perl可以在一行中做到这一点,我也不会感到惊讶。如果可以,请使用sed
:)
答案 1 :(得分:3)
我建议读取和写入更大的块(无论是行还是大量字节)。这应该减少您需要执行的IO并允许您更快地运行。但是,您的文件可能太大而无法在内存中轻松操作。使用读/写大小播放并查看最快的内容。
答案 2 :(得分:3)
perl -spi.og -e 's/\\/\\\\/gm' infile
将你的infile重写并将infile.og作为你的备份。
答案 3 :(得分:2)
这是Perl构建的任务,几乎肯定会更快,但前提是您已经熟悉该语言。话虽这么说,您可以通过读取更大的缓冲区并使用正则表达式替换来轻松调整JavaScript代码。看看String.replace方法。
答案 4 :(得分:0)