Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   перезапись в тот же файл (http://forum.oszone.net/showthread.php?t=301921)

ruslaw 01-07-2015 18:01 2524734

перезапись в тот же файл
 
Имеется стандартный код для замены в файле символов @ на символы #

Цитата:

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 2524777

Можно. Каков примерный объём отдельного файла?

ruslaw 01-07-2015 20:04 2524801

от 10 кб. до 3-5 Мб.

greg zakharov 01-07-2015 20:30 2524810

Всего лишь пример:
Код:

(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 2524919

Цитата:

Цитата ruslaw
от 10 кб. до 3-5 Мб. »

При таких размерах с точки зрения производительности имеет смысл читать/писать не построчно (и не разбирать/собирать в массив), а целиком.

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

ruslaw 02-07-2015 11:02 2524986

Цитата:

Цитата Iska
Я могу Вам такое «нарисовать» на VBScript. »

буду признателен

Iska 03-07-2015 03:36 2525307

Примерно так (не проверялось):
Скрытый текст
Код:

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 2525697

Да, спасибо, работает. Я даже приспособил его через батник делать пакетную обработку.


Время: 23:38.

Время: 23:38.
© OSzone.net 2001-