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

[文本处理] 文本批量替换字符的批处理求助

各位大神好:
有一批文本内容格式如下;RCP格式可以记事本打开;判断文件名是否包含04T字符,不包含04T的文件将C0_E0后面的1,0,0或2,0,0替换为3,0,1
SMD-Product,C:\AV03-2322-1\Data\RecipeFile\ChmRcpData\R0001\AD IMPROVE-AB,1:C+W+M+C,1,1,0.7t,2023/07/24 18:02:37,C2,NotUse,C2,NotUse,LotClean,NotUse,Clean Cycle,NotUse,,C:\AV03-2322-1\Data\RecipeFile\PtnRcpData\S12100_P10_C0_E0,1,0,0,C:\AV03-2322-1\Data\RecipeFile\PtnRcpData\S12100_P02_C0_E0,2,0,0,S3 or S4,,
,,,,,,,,,,,,

回复 1# haichuan5121


    找个真实的文件,把操作之前、操作之后的两份文件打包上传到网盘,我试试。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 2# Batcher

内部局域网限制上传附件;文本全部内容就是下面字符RCP格式可以记事本打开,其中2,0,0也可能是1,0,0

SMD-Product,C:\A-B-1\Data\RecipeFile\ChmRcpData\R0001\AD IMPROVE-AB,1:C+W+M+C,1,1,0.7t,2023/07/24 18:02:37,C2,NotUse,C2,NotUse,LotClean,NotUse,Clean Cycle,NotUse,,C:\A-B-1\Data\RecipeFile\PtnRcpData\S12100_P10_C0_E0,2,0,0,C:\A-B-1\Data\RecipeFile\PtnRcpData\S12100_P02_C0_E0,2,0,0,S3 or S4,,
,,,,,,,,,,,,
变更后是
SMD-Product,C:\A-B-1\Data\RecipeFile\ChmRcpData\R0001\AD IMPROVE-AB,1:C+W+M+C,1,1,0.7t,2023/07/24 18:02:37,C2,NotUse,C2,NotUse,LotClean,NotUse,Clean Cycle,NotUse,,C:\A-B-1\Data\RecipeFile\PtnRcpData\S12100_P10_C0_E0,3,0,1,C:\A-B-1\Data\RecipeFile\PtnRcpData\S12100_P02_C0_E0,3,0,1,S3 or S4,,
,,,,,,,,,,,,

TOP

没有测试文件,只能这样试试:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /a-d *.RCP^|findstr /v "04T"') do (
  4.     (for /f "delims=" %%j in ('type "%%i"') do (
  5.         set "str=%%j"
  6.         set "str=!str:C0_E0,1,0,0=C0_E0,3,0,1!"
  7.         set "str=!str:C0_E0,2,0,0=C0_E0,3,0,1!"
  8.         echo,!str!
  9.     ))>New-%%i
  10. )
  11. pause
复制代码
1

评分人数

TOP

回复 4# qixiaobin0715

执行结果是这个  ;批处理过程覆盖源文件了

   
C:\Users\admin\Desktop\PI\SP01>(
set "str=SMD-Product,C:\SH03-9322-1\Data\RecipeFile\ChmRcpData\R0001\AD IMPROVE-AB,1:C+W+M+C,1,1,0.7t,2023/07/24 18:02:37,C2,NotUse,C2,NotUse,LotClean,NotUse,Clean Cycle,NotUse,,C:\SH03-9322-1\Data\RecipeFile\PtnRcpData\S12100_P10_C0_E0,1,0,0,C:\SH03-9322-1\Data\RecipeFile\PtnRcpData\S12100_P02_C0_E0,2,0,0,S3 or S4,,"  
set "str=!str:C0_E0,1,0,0=C0_E0,3,0,1!"  
set "str=!str:C0_E0,2,0,0=C0_E0,3,0,1!"  
echo,!str!
)
SMD-Product,C:\SH03-9322-1\Data\RecipeFile\ChmRcpData\R0001\AD IMPROVE-AB,1:C+W+M+C,1,1,0.7t,2023/07/24 18:02:37,C2,NotUse,C2,NotUse,LotClean,NotUse,Clean Cycle,NotUse,,C:\SH03-9322-1\Data\RecipeFile\PtnRcpData\S12100_P10_C0_E0,3,0,1,C:\SH03-9322-1\Data\RecipeFile\PtnRcpData\S12100_P02_C0_E0,3,0,1,S3 or S4,,

C:\Users\admin\Desktop\PI\SP01>(
set "str=,,,,,,,,,,,,"  
set "str=!str:C0_E0,1,0,0=C0_E0,3,0,1!"  
set "str=!str:C0_E0,2,0,0=C0_E0,3,0,1!"  
echo,!str!
)
,,,,,,,,,,,,

TOP

1.复制代码内容时,请点击代码下面的“复制代码”,不要选中复制;
2.最好发一个测试文件上来。
如果还不行,我就放弃吧。

TOP

本帖最后由 aloha20200628 于 2024-8-15 13:52 编辑

回复 3# haichuan5121

以下批处代码仅处理当前目录下文件名未含 04T 的文本文件,假设其扩展名为 .rcp
其中包含 C0_E0,1,0,0 或者 C0_E0,2,0,0 的字段均被置换为  C0_E0,3,0,1
新文件名=源文件名.new.rcp
  1. @echo off &for /f "delims=" %%F in ('dir /b/a-d *rcp^|findstr /irvc:"04t" ') do (
  2.       powershell "(gc '%%F') -replace 'C0_E0,\d,0,0', 'C0_E0,3,0,1' ">"%%~nF.new%%~xF"
  3. )
  4. pause&exit/b
复制代码
再让ps代劳一步...
  1. @echo off & powershell "dir *.rcp -exclude '*04T*'|%%{((gc $_.name) -replace 'C0_E0,\d,0,0', 'C0_E0,3,0,1')|sc ($_.basename+'.new.rcp')}"
  2. pause&exit/b
复制代码

TOP

  1. @echo off
  2. cd /d "%~dp0"
  3. for /f "delims=" %%i in ('dir /b /a-d *.rcp ^|find /v "04T"') do (
  4. (for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^<"%%i"') do (
  5. if "%%b" equ "" (
  6. echo=
  7. ) else (
  8. set str=%%b
  9. setlocal enabledelayedexpansion
  10. set str=!str:C0_E0,1,0,0=C0_E0,3,0,1!
  11. echo=!str:C0_E0,2,0,0=C0_E0,3,0,1!
  12. endlocal
  13. )
  14. ))>"%%~ni_2%%~xi"
  15. )
  16. pause
复制代码
bat小白,请多指教!谢谢!

TOP

回复 4# qixiaobin0715


    可以用了感谢感谢大神

TOP

本帖最后由 qixiaobin0715 于 2024-8-14 14:56 编辑

回复 9# haichuan5121
是漏掉了首行?@echo off

TOP

回复 8# 77七


    可以可以 感谢!要把3,0,1变回1.0.0或2.0.0怎么写,能不能根据提示输入后执行;文档两个C0_E0后参数根据需求修改;
比如提示输入12 则内容  第一个3.0.1变更为1.0.0,第二个3.0.1变更为2.0.0
比如提示输入11 则内容  第一个3.0.1变更为1.0.0,第二个3.0.1变更为1.0.0
比如提示输入13 则内容  第一个3.0.1变更为1.0.0,第二个3.0.1变更为3.0.1

TOP

本帖最后由 haichuan5121 于 2024-8-14 15:27 编辑

回复 10# qixiaobin0715


       对的我看执行过程把OFF 改成ON了  
感谢!要把3,0,1变回1.0.0或2.0.0怎么写,C0_E0后面只有这三个组合
能不能根据提示输入后执行;文档两个C0_E0后参数根据需求修改;
比如提示输入12 则内容  第一个3.0.1变更为1.0.0,第二个3.0.1变更为2.0.0
比如提示输入11 则内容  第一个3.0.1变更为1.0.0,第二个3.0.1变更为1.0.0
比如提示输入13 则内容  第一个3.0.1变更为1.0.0,第二个3.0.1变更为3.0.1
比如提示输入21 则内容  第一个3.0.1变更为2.0.0,第二个3.0.1变更为1.0.0
比如提示输入22 则内容  第一个3.0.1变更为2.0.0,第二个3.0.1变更为2.0.0
比如提示输入23 则内容  第一个3.0.1变更为1.0.0,第二个3.0.1变更为3.0.1

TOP

回复 12# haichuan5121
替换需要一个字符作为锚点,此字符不能在文本的任何地方出现,这里选为“`”,如果文本中含有此字符,请自行更换:
  1. @echo off
  2. set /p n=Please Input No. :
  3. setlocal enabledelayedexpansion
  4. set x1=C0_E0,1.0.0
  5. set x2=C0_E0,2.0.0
  6. set x3=C0_E0,3.0.1
  7. for /l %%i in (1,1,3) do (
  8.     for /l %%j in (1,1,3) do (
  9.         set m=%%i%%j
  10.         if !n! equ !m! (
  11.             set a1=!x%%i!
  12.             set a2=!x%%j!
  13.         )
  14.     )
  15. )
  16. for /f "delims=" %%i in ('dir /b /a-d *.RCP^|findstr /v "04T"') do (
  17.     (for /f "delims=" %%j in ('type "%%i"') do (
  18.         set "str=%%j"
  19.         set "str=!str:C0_E0,3,0,1=`!"
  20.         if "!str!"=="%%j" (
  21.             echo,%%j
  22.         ) else (
  23.             for /f "tokens=1,2* delims=`" %%a in ("!str!") do (
  24.                 echo,%%a!a1!%%b!a2!%%c
  25.             )
  26.         )
  27.     ))>New-%%i
  28. )
  29. pause
复制代码
这里也是针对顶楼所说的“文件名中不包含04T文件”。
代码未经测试,请注意备份好源文件,以免出现意外。

TOP

回复 12# haichuan5121
刚刚注意到,你前面的数字之间是逗号,后面是点号,写代码时我也没注意,前后不统一,请根据文本具体情况自行修改。3.0.1————3,0,1

TOP

回复 11# haichuan5121


   这个和1楼的替换应该是一回事,就是替换 两段C0_E0后数字,可以写个通用脚本,用批处理有点麻烦,用其它脚本或第三方文本工具的正则应该好点。
bat小白,请多指教!谢谢!

TOP

返回列表