找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 15289|回复: 6

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

  [复制链接]
发表于 2022-1-6 13:39:14 | 显示全部楼层 |阅读模式
本帖最后由 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
发表于 2022-1-6 14:02:33 | 显示全部楼层
  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. }
复制代码
发表于 2022-1-6 14:15:52 | 显示全部楼层
我早就回复了 你没看到吗
 楼主| 发表于 2022-1-6 16:25:04 | 显示全部楼层
回复 2# zaqmlp


我试了一下,数值没有变,没减去600,有办法解决吗?
发表于 2022-1-6 16:28:32 | 显示全部楼层
回复 4# levelintt

结果文件在result文件夹,加你Q没回应,或者网盘分享实际文件
 楼主| 发表于 2022-1-6 16:44:00 | 显示全部楼层
回复 5# zaqmlp

刚才我操作的文件有点问题,已解决,谢谢了!
 楼主| 发表于 2022-1-6 20:44:36 | 显示全部楼层
回复 2# zaqmlp

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

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 04:28 , Processed in 0.018443 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表