Board logo

标题: [文本处理] 求教批处理实现txt文本内容替换 [打印本页]

作者: 爱琴海不会走    时间: 2019-1-5 01:29     标题: 求教批处理实现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
作者: Batcher    时间: 2019-1-5 11:29

work.txt
替换.txt
打包压缩上传到顶楼,我试试。
作者: xczxczxcz    时间: 2019-1-5 11:35

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
复制代码

作者: 爱琴海不会走    时间: 2019-1-5 12:02

[attach]11677[/attach]
作者: 爱琴海不会走    时间: 2019-1-5 12:04

回复 2# Batcher


    https://pan.baidu.com/s/1398x1BY1o3N5wq2Q_p2kMA
作者: 爱琴海不会走    时间: 2019-1-5 12:54

回复 3# xczxczxcz


    谢谢老哥,我试了,这个是可以的,但是只有多处错误才提示,能不能把没找到的也提示。
作者: xczxczxcz    时间: 2019-1-5 17:03

回复 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
复制代码
========睡了会,精神多了===========
作者: WHY    时间: 2019-1-5 18:00

  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);
复制代码

作者: 爱琴海不会走    时间: 2019-1-7 14:10

回复 8# WHY


    谢谢大佬
作者: 爱琴海不会走    时间: 2019-1-8 20:30

回复 8# WHY


    大佬,如果把找到多处不处理改为处理,要怎么改?
作者: WHY    时间: 2019-1-9 09:25

  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);
复制代码

作者: 爱琴海不会走    时间: 2019-1-9 09:58

本帖最后由 爱琴海不会走 于 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中,避免了某处多次修改的问题!
给你点赞,代码我要多看看!
谢谢你




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2