CMD/BAT - [решено] Поиск и замена

Аватара пользователя
user689

CMD/BAT - [решено] Поиск и замена

Сообщение user689 »

Добрый день.

Имеется тектовый файл, размером более 5000 строк. Вида:



pl (IdPl,X,Y,TitleLine,Name,Description,idRowMetric,idPlMetric,Person) Values (26916,1000,3750,'','','11',null,NULL,1)

pla (IdPl,EncLevel,IdSection) Values (26916,2,21)

pla(IdPl,EncLevel,IdSection) Values (26916,1,1065)



Pl (IdPl,X,Y,TitleLine,Name,Description,idRowMetric,idPlMetric,Person) Values (26917,2900,3750,'','','11',null,NULL,1)

Pla(IdPl,EncLevel,IdSection) Values (26917,2,21)

Pla (IdPl,EncLevel,IdSection) Values (26917,1,1065)



Pl (IdPl,X,Y,TitleLine,Name,Description,idRowMetric,idPlMetric,Person) Values (26918,1050,3750,'','','11',null,NULL,1)

Pla (IdPl,EncLevel,IdSection) Values (26918,2,21)

Pla (IdPl,EncLevel,IdSection) Values (26918,1,1065)



Pl (IdPl,X,Y,TitleLine,Name,Description,idRowMetric,idPlMetric,Person) Values (26919,1100,3750,'','','11',null,NULL,1)

Pla (IdPl,EncLevel,IdSection) Values (26919,2,21)

Pla (IdPl,EncLevel,IdSection) Values (26919,1,1065)




Задача состоит в том, что-бы заменить все Выделенные жирным цветом значения(они меняются +1 каждую четвертую строчку), на отрицательные цифры по порядку: 26916 == -1 , 26917 == -2 , 26918 == -3 ...
Аватара пользователя
greg zakharov

Re: CMD/BAT - [решено] Поиск и замена

Сообщение greg zakharov »

user689, уважаемый, Вы в своем уме? Обрабатывать файл в пять тысяч строк на командном языке - что-то из разряда утонченного извращения. PowerShell'то достаточно долго думал, к слову, решение на нем будет выглядеть примерно так:



Код:

Код: Выделить всё

gc file | % {$a=-1;$b=0}{$_ -replace '(\d{5})', $a;$b++;if($b -eq 4){$b=0;$a+=-1}}

Наименее затратным по времени оказался Perl:



Код:

Код: Выделить всё

perl -pe 's/(\d{5})/-($1-26915)/e' file

Чуть более затратным оказался Python, далее - Ruby. sed'ом еще не пробовал, но, нужно полагать, он немногим уступает тому же Python'у или Perl'у.
Аватара пользователя
user689

Re: CMD/BAT - [решено] Поиск и замена

Сообщение user689 »

PS C:\Documents and Settings\Администратор> $a.matches.value[0]..$a.matches.value[-1] | foreach { $n=0 } { $b = $b -repl

ace $_, --$n }

Не удается индексировать в массив NULL.

строка:1 знак:18

+ $a.matches.value[
Аватара пользователя
Foreigner

Re: CMD/BAT - [решено] Поиск и замена

Сообщение Foreigner »

На PowerShell можно еще так:



Код:

Код: Выделить всё

$a=0; (gc file.txt -read 4) | foreach { $_ -replace '\d{5}', --$a } | sc file.txt

или, если это будет "затратно", то сначала создать временный файл, а потом уже заменить им исходный.
Аватара пользователя
greg zakharov

Re: CMD/BAT - [решено] Поиск и замена

Сообщение greg zakharov »

Цитата greg zakharov:



Но все равно медленне Perl'а.
CMD/BAT - [решено] Поиск и замена




Ничего не попишешь. А Perl какой и под какую платформу?
Аватара пользователя
Foreigner

Re: CMD/BAT - [решено] Поиск и замена

Сообщение Foreigner »

В принципе, если гибридить JScript с командным языком, то:

Код: Выделить всё

0</* :
@cscript /nologo /e:jscript "%~f0" %*&exit /b */0;
(function(file) {
  with (new ActiveXObject('Scripting.FileSystemObject')) {
    if (!FileExists(file)) {
      WScript.echo('File not found or does not exist.');
      return;
    }
    var fs = OpenTextFile(GetAbsolutePathName(file), 1);
    while (!fs.atEndOfStream) {
      var s = fs.ReadLine();
      if (s !== null) {
        WScript.echo(s.replace(/\d{5}/, "-" + (s.match(/\d{5}/)-26915)));
      }
    }
    fs.Close();
  }
}(
  WScript.Arguments.length !== 1
  ? (function() {
    WScript.echo('Usage: ' + WScript.ScriptName + ' <file>');
    WScript.echo('.e.g.: ' + WScript.ScriptName + ' E:\\sandbox\\file.txt');
    WScript.Quit(1);
  }()) : WScript.Arguments.Unnamed(0)
));
Аватара пользователя
Foreigner

Re: CMD/BAT - [решено] Поиск и замена

Сообщение Foreigner »

В принципе, если гибридить JScript с командным языком, то:

Код: Выделить всё

0</* :
@cscript /nologo /e:jscript "%~f0" %*&exit /b */0;
(function(file) {
  with (new ActiveXObject('Scripting.FileSystemObject')) {
    if (!FileExists(file)) {
      WScript.echo('File not found or does not exist.');
      return;
    }
    var fs = OpenTextFile(GetAbsolutePathName(file), 1);
    while (!fs.atEndOfStream) {
      var s = fs.ReadLine();
      if (s !== null) {
        WScript.echo(s.replace(/\d{5}/, "-" + (s.match(/\d{5}/)-26915)));
      }
    }
    fs.Close();
  }
}(
  WScript.Arguments.length !== 1
  ? (function() {
    WScript.echo('Usage: ' + WScript.ScriptName + ' <file>');
    WScript.echo('.e.g.: ' + WScript.ScriptName + ' E:\\sandbox\\file.txt');
    WScript.Quit(1);
  }()) : WScript.Arguments.Unnamed(0)
));
Аватара пользователя
user689

Re: CMD/BAT - [решено] Поиск и замена

Сообщение user689 »

Цитата user689:



А как быть если…
CMD/BAT - [решено] Поиск и замена




Лучшим было бы прикладывать образец реального файла, упакованного в архив.
Аватара пользователя
user689

Re: CMD/BAT - [решено] Поиск и замена

Сообщение user689 »

Пример файла во вложении.

ttv.7z
Ответить

Вернуться в «Скриптовые языки администрирования Windows»