标题: 【已解决】30元求批处理:在包含某字符串的行将指定数值运算后进行替换 [打印本页]
作者: levelintt 时间: 2022-1-6 13:39 标题: 【已解决】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
作者: zaqmlp 时间: 2022-1-6 14:02
- <# :
- cls&echo off&cd /d "%~dp0"
- powershell -NoProfile -ExecutionPolicy bypass "[IO.File]::ReadAllText('%~f0',[Text.Encoding]::GetEncoding('GB2312'))|Invoke-Expression"
- pause
- exit
- #>
- $newfolder="result";
- if(-not (test-path -literal $newfolder)){[void][IO.Directory]::CreateDirectory($newfolder)};
- $enc=[Text.Encoding]::GetEncoding('GB2312');
- $reg='('+[regex]::Escape('$CC32')+'.*?'+[regex]::Escape('$BB0')+')(\d+)('+[regex]::Escape('$HH')+')';
- $files=@(dir -literal "."|?{('.txt' -eq $_.Extension) -and ($_ -is [System.IO.FileInfo])});
- for($i=0;$i -lt $files.length;$i++){
- write-host $files[$i].Name;
- $text=[IO.File]::ReadAllLines($files[$i].FullName, $enc);
- for($j=0;$j -lt $text.count;$j++){
- $text[$j]=[regex]::replace($text[$j], $reg, {
- param($m);
- $len=$m.groups[2].value.length;
- $value=([int]$m.groups[2].value - 600).toString().PadLeft($len, '0');
- $m.groups[1].value+$value+$m.groups[3].value;
- });
- }
- $newfile=$newfolder.trimend('\')+'\'+$files[$i].Name;
- [IO.File]::WriteAllLines($newfile, $text, $enc);
- }
复制代码
作者: flashercs 时间: 2022-1-6 14:15
我早就回复了 你没看到吗
作者: levelintt 时间: 2022-1-6 16:25
回复 2# zaqmlp
我试了一下,数值没有变,没减去600,有办法解决吗?
作者: zaqmlp 时间: 2022-1-6 16:28
回复 4# levelintt
结果文件在result文件夹,加你Q没回应,或者网盘分享实际文件
作者: levelintt 时间: 2022-1-6 16:44
回复 5# zaqmlp
刚才我操作的文件有点问题,已解决,谢谢了!
作者: levelintt 时间: 2022-1-6 20:44
回复 2# zaqmlp
如果其它文本行中没有$CC32,而是有$CC64,也要符合$CC32一样的规则,也就是说只要有$CC32或$CC64字符,都需要把$BB和$HH之间的数值减去600,能帮忙给补充修改一下吗?
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |