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

[文本处理] 求教批处理实现txt文本内容替换

本帖最后由 爱琴海不会走 于 2019-1-5 13:42 编辑

工作中有这样的任务:
在work.txt中有一行内容,很长很长,在work.txt同目录下有个 替换.txt,替换.txt格式如下:

在替换.txt中内容是成对出现的,比如第1行与第2行对应,第3行与第4行对应,我想实现:
假如  替换.txt 中第1行内容在work.txt中存在,,且work.txt中仅有一处内容与替换.txt第1行内容相同,替换 work.txt中相关内容为 替换.txt 中第2行内容,
假如 替换.txt 中第3行内容在work.txt中存在,,且work.txt中仅有一处内容与替换.txt第3行内容相同,替换 work.txt中相关内容为 替换.txt 中第4行内容,
假如 替换.txt 中第5行内容在work.txt中存在,,且work.txt中仅有一处内容与替换.txt第5行内容相同,替换 work.txt中相关内容为 替换.txt 中第6行内容,
假如 替换.txt 中第7行内容在work.txt中不存在,把第7行记录下来,标记为无(当然也不执行替换第8行操作了)
假如 替换.txt 中第9行内容在work.txt中存在,且存在次数超过1次,也把第9行记录下来,标记为多处错误(当然也不执行替换第10行操作了)
。。。。
假如 替换.txt 中第2n+1行内容在work.txt中存在,且只存在一处,替换 work.txt中相关内容为 替换.txt 中第2n+2行内容。
替换.txt 行数很多,但都是成对出现的。
通俗来说就是 假如 替换.txt第1行是123,第2行是456,如果work.txt中存在123且只有一处,就替换为456.
不知有没有大神碰到类似的问题,能为我提供经验,感谢观看。
附件:https://pan.baidu.com/s/1398x1BY1o3N5wq2Q_p2kMA

work.txt
替换.txt
打包压缩上传到顶楼,我试试。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

powershell 用法搜索.
  1. # 先备份,会直接修改原文件。
  2. $组 = @{}
  3. $替换 = gc 替换.txt
  4. for ( $i=0; $i -lt $替换.count; $i++ ) {
  5. if (!($i % 2)) {
  6. $key=$替换[$i]
  7. } else {
  8. $组["$key"]=$替换[$i]
  9. }
  10. }
  11. $Content = ( gc work.txt -readcount 0 -enc Default ) -join "`r`n"
  12. Foreach ( $key in $组.keys ) {
  13. if ( ($Content -Split "$key").Count -le 2 ) {
  14. $Value = $组["$key"]
  15. $Content = $Content -replace "$key","$Value"
  16. } else {
  17. for ( $i=0; $i -lt $替换.count; $i++ ) {
  18. if ( $替换[$i] -eq "$key" ) {
  19. Write-Host "第 $($i+1) 行存在多处错误`n$key`r`n" -fore Magenta -back DarkBlue
  20. }
  21. }
  22. }
  23. }
  24. $Content | sc .\work.txt -enc Default
  25. CMD /C "echo;&pause" #兼容PS2.0
复制代码

TOP

[attach]11677[/attach]

TOP

回复 2# Batcher


    https://pan.baidu.com/s/1398x1BY1o3N5wq2Q_p2kMA

TOP

回复 3# xczxczxcz


    谢谢老哥,我试了,这个是可以的,但是只有多处错误才提示,能不能把没找到的也提示。

TOP

回复 6# 爱琴海不会走

增加找不到的也提示。可能开始看错了,以为只要输出存在多处的。
  1. $组 = @{}
  2. $替换 = gc 替换.txt
  3. for ( $i=0; $i -lt $替换.count; $i++ ) {
  4. if (!($i % 2)) { $key = $替换[$i] } else { $组["$key"] = $替换[$i] }
  5. }
  6. $Content = ( gc work.txt -readcount 0 -enc Default ) -join "`r`n"
  7. Foreach ( $key in $组.keys ) {
  8. $num = ($Content -Split "$key").Count
  9. if ( $num -eq 2 ) {
  10. $Value = $组["$key"]
  11. $Content = $Content -replace "$key","$Value"
  12. } else {
  13. for ( $i=0; $i -lt $替换.count; $i++ ) {
  14. if ( $替换[$i] -eq "$key" ) {
  15. if ( $num -gt 2 ) {
  16. Write-Host "第 $($i+1) 行存在多处错误`n$key`r`n" -fore Yellow -back DarkRed
  17. } else {
  18. Write-Host "第 $($i+1) 行找不到`n$key`r`n" -fore Magenta -back DarkBlue
  19. }
  20. }
  21. }
  22. }
  23. }
  24. $Content | sc .\work.txt -enc Default
  25. CMD /C "echo;&pause" # 兼容 PS2.0
复制代码
========睡了会,精神多了===========

TOP

  1. @if(0)==(0) echo off
  2. cscript //nologo //e:jscript "%~f0" <  替换.txt
  3. pause & goto :EOF
  4. @end
  5. var n = 1;
  6. var fso = new ActiveXObject('Scripting.FileSystemObject');
  7. var str = fso.OpenTextFile('work.txt', 1).ReadAll();
  8. while(!WSH.StdIn.AtEndOfStream){
  9.     var key1 = WSH.StdIn.ReadLine(), key2 = WSH.StdIn.ReadLine();
  10.     var Len  = str.split(key1).length;
  11.     if (Len < 2) {
  12.         WSH.Echo('第' + n + '行 无\n' + key1);
  13.     } else if (Len == 2) {
  14.         str = str.replace(key1, key2);
  15.     } else {
  16.         WSH.Echo('第' + n + '行 多处\n' + key1);
  17.     }
  18.     n += 2;
  19. }
  20. fso.OpenTextFile('Result.Log', 2, true).Write(str);
复制代码

TOP

回复 8# WHY


    谢谢大佬

TOP

回复 8# WHY


    大佬,如果把找到多处不处理改为处理,要怎么改?

TOP

  1. @if(0)==(0) echo off
  2. cscript //nologo //e:jscript "%~f0" <  替换.txt
  3. pause & goto :EOF
  4. @end
  5. var n = 1;
  6. var fso = new ActiveXObject('Scripting.FileSystemObject');
  7. var str = fso.OpenTextFile('work.txt', 1).ReadAll();
  8. while(!WSH.StdIn.AtEndOfStream){
  9.     var key1 = WSH.StdIn.ReadLine(), key2 = WSH.StdIn.ReadLine();
  10.     var arr  = str.split(key1);
  11.     var Len  = arr.length;
  12.     if (Len < 2) {
  13.         WSH.Echo('第' + n + '行 无\n' + key1);
  14.     } else {
  15.         str = arr.join(key2);
  16.     }
  17.     n += 2;
  18. }
  19. fso.OpenTextFile('Result.Log', 2, true).Write(str);
复制代码

TOP

本帖最后由 爱琴海不会走 于 2019-1-9 10:06 编辑

回复 11# WHY


    谢谢大佬,我之前有个疑惑。
假如work.txt中有个AAA,按照替换.txt前面的把AAA替换成了BBB,假如 替换.txt 后面又有把BBB替换CCC,那么,work.txt中的AAA是BBB还是CCC。
按道理,应该是BBB是正确的。
你把文件都写入Result.Log,估计就是为了解决这个问题的,work.txt始终是最原始数据,搜索是在work.txt中搜索的,修改是在result.log中,避免了某处多次修改的问题!
给你点赞,代码我要多看看!
谢谢你

TOP

返回列表