Войти

Показать полную графическую версию : перезапись в тот же файл


ruslaw
01-07-2015, 18:01
Имеется стандартный код для замены в файле символов @ на символы #

var myFileSysObj = new ActiveXObject("Scripting.FileSystemObject");
// Создать объекты TextStream для считывания и для записи.
var myInputTextStream = myFileSysObj.OpenTextFile("E:\\depo\\test.htm", 1, true);
var myOutputTextStream = myFileSysObj.OpenTextFile("E:\\depo\\test2.htm", 2, true);
// Создать объект RegExp для замены символов @
var rest = new RegExp("@","g");
// Выполнять итерации по каждой строке с записью измененных строк во второй файл.
while(!myInputTextStream.AtEndOfStream) {
myOutputTextStream.WriteLine(myInputTextStream.ReadLine().replace(rest,"#"));
}
// Закрыть потоки в файлы.
myInputTextStream.Close();
myOutputTextStream.Close();
Исходный файл считывается построчно и измененные строки записываются в новый файл.
Можно ли записать их в исходный файл, удали прежние строки?

Iska
01-07-2015, 19:24
Можно. Каков примерный объём отдельного файла?

ruslaw
01-07-2015, 20:04
от 10 кб. до 3-5 Мб.

greg zakharov
01-07-2015, 20:30
Всего лишь пример:(function(file) {
var fs, buf = [];

try {
with (new ActiveXObject('Scripting.FileSystemObject')) {
fs = OpenTextFile(file, 1);

while (!fs.AtEndOfStream) {
buf.push(fs.ReadLine().replace(/@/g, '#'));
}
fs.Close();

fs = OpenTextFile(file, 2);
fs.Write(buf.join('\n'));
fs.Close();
}
}
catch (e) {
WScript.echo(e);
}
}(
WScript.Arguments.length !== 1
? WScript.Quit(1)
: WScript.Arguments.Unnamed(0)
));Если в системе имеется SAPI.SpFileStream, можно через него.

Iska
02-07-2015, 06:52
от 10 кб. до 3-5 Мб. »
При таких размерах с точки зрения производительности имеет смысл читать/писать не построчно (и не разбирать/собирать в массив), а целиком.

Я могу Вам такое «нарисовать» на VBScript. Если Вам обязательно на JScript (у меня нет желания с ним связываться), то просите коллегу greg zakharov'а или других коллег.

ruslaw
02-07-2015, 11:02
Я могу Вам такое «нарисовать» на VBScript. »
буду признателен

Iska
03-07-2015, 03:36
Примерно так (не проверялось):
Option Explicit

Const ForWriting = 2


Dim strSourceFile
Dim strContent


If WScript.Arguments.Count = 1 Then
strSourceFile = WScript.Arguments.Item(0)

With WScript.CreateObject("Scripting.FileSystemObject")
If .FileExists(strSourceFile) Then
With .OpenTextFile(strSourceFile)
strContent = .ReadAll()
.Close
End With

With .OpenTextFile(strSourceFile, ForWriting)
.Write Replace(strContent, "@", "#")
.Close
End With
Else
WScript.Echo "Can't find source file [" & strSourceFile & "]."
WScript.Quit 2
End If
End With
Else
WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file>"
WScript.Quit 1
End If

WScript.Quit 0

Путь к целевому файлу указывается аргументом скрипта (также можно просто перетащить целевой файл на скрипт в Проводнике).

ruslaw
04-07-2015, 03:18
Да, спасибо, работает. Я даже приспособил его через батник делать пакетную обработку.




© OSzone.net 2001-2012