[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

【已解决】30元求批处理:在包含某字符串的行将指定数值运算后进行替换

本帖最后由 levelintt 于 2022-1-7 12:55 编辑

在求助区没等到回复,以后要用到不少关于文本的处理工作,在这里请高手帮忙解答:

如下面例子,1个文件里有多行这样的文本,这只是其中1行,要把包含$CC32字符的行中的$BB0和$HH之间的数字减去600,然后替换掉原来的数字。
$K$AAZYGG1105  $WA    $F011   $F051   $F071   $F111   $ID00003301000101      $DD0$SS01$P01183320      $P05183320      $P07183320      $P11183320      $P13            $P15            $P17            $CC32$CF14     $BB074400$HH204700$WW000$V1000000
完成后是下面这样的:
$K$AAZYGG1105  $WA    $F011   $F051   $F071   $F111   $ID00003301000101      $DD0$SS01$P01183320      $P05183320      $P07183320      $P11183320      $P13            $P15            $P17            $CC32$CF14     $BB073800$HH204700$WW000$V1000000
联系方式:QQ 825998898

  1. <# :
  2. cls&echo off&cd /d "%~dp0"
  3. powershell -NoProfile -ExecutionPolicy bypass "[IO.File]::ReadAllText('%~f0',[Text.Encoding]::GetEncoding('GB2312'))|Invoke-Expression"
  4. pause
  5. exit
  6. #>
  7. $newfolder="result";
  8. if(-not (test-path -literal $newfolder)){[void][IO.Directory]::CreateDirectory($newfolder)};
  9. $enc=[Text.Encoding]::GetEncoding('GB2312');
  10. $reg='('+[regex]::Escape('$CC32')+'.*?'+[regex]::Escape('$BB0')+')(\d+)('+[regex]::Escape('$HH')+')';
  11. $files=@(dir -literal "."|?{('.txt' -eq $_.Extension) -and ($_ -is [System.IO.FileInfo])});
  12. for($i=0;$i -lt $files.length;$i++){
  13.     write-host $files[$i].Name;
  14.     $text=[IO.File]::ReadAllLines($files[$i].FullName, $enc);
  15.     for($j=0;$j -lt $text.count;$j++){
  16.         $text[$j]=[regex]::replace($text[$j], $reg, {
  17.             param($m);
  18.             $len=$m.groups[2].value.length;
  19.             $value=([int]$m.groups[2].value - 600).toString().PadLeft($len, '0');
  20.             $m.groups[1].value+$value+$m.groups[3].value;
  21.         });
  22.     }
  23.     $newfile=$newfolder.trimend('\')+'\'+$files[$i].Name;
  24.     [IO.File]::WriteAllLines($newfile, $text, $enc);
  25. }
复制代码
提供bat代写,为你省时省力省事,支付宝扫码头像支付
微信: unique2random

TOP

我早就回复了 你没看到吗
微信:flashercs
QQ:49908356

TOP

回复 2# zaqmlp


我试了一下,数值没有变,没减去600,有办法解决吗?

TOP

回复 4# levelintt

结果文件在result文件夹,加你Q没回应,或者网盘分享实际文件
提供bat代写,为你省时省力省事,支付宝扫码头像支付
微信: unique2random

TOP

回复 5# zaqmlp

刚才我操作的文件有点问题,已解决,谢谢了!

TOP

回复 2# zaqmlp

如果其它文本行中没有$CC32,而是有$CC64,也要符合$CC32一样的规则,也就是说只要有$CC32或$CC64字符,都需要把$BB和$HH之间的数值减去600,能帮忙给补充修改一下吗?

TOP

返回列表