标题: [文本处理] 求教批处理实现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 用法搜索.- # 先备份,会直接修改原文件。
-
- $组 = @{}
- $替换 = gc 替换.txt
-
- for ( $i=0; $i -lt $替换.count; $i++ ) {
- if (!($i % 2)) {
- $key=$替换[$i]
- } else {
- $组["$key"]=$替换[$i]
- }
- }
-
- $Content = ( gc work.txt -readcount 0 -enc Default ) -join "`r`n"
- Foreach ( $key in $组.keys ) {
- if ( ($Content -Split "$key").Count -le 2 ) {
- $Value = $组["$key"]
- $Content = $Content -replace "$key","$Value"
- } else {
- for ( $i=0; $i -lt $替换.count; $i++ ) {
- if ( $替换[$i] -eq "$key" ) {
- Write-Host "第 $($i+1) 行存在多处错误`n$key`r`n" -fore Magenta -back DarkBlue
- }
- }
- }
- }
- $Content | sc .\work.txt -enc Default
-
- 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# 爱琴海不会走
增加找不到的也提示。可能开始看错了,以为只要输出存在多处的。- $组 = @{}
- $替换 = gc 替换.txt
- for ( $i=0; $i -lt $替换.count; $i++ ) {
- if (!($i % 2)) { $key = $替换[$i] } else { $组["$key"] = $替换[$i] }
- }
- $Content = ( gc work.txt -readcount 0 -enc Default ) -join "`r`n"
- Foreach ( $key in $组.keys ) {
- $num = ($Content -Split "$key").Count
- if ( $num -eq 2 ) {
- $Value = $组["$key"]
- $Content = $Content -replace "$key","$Value"
- } else {
- for ( $i=0; $i -lt $替换.count; $i++ ) {
- if ( $替换[$i] -eq "$key" ) {
- if ( $num -gt 2 ) {
- Write-Host "第 $($i+1) 行存在多处错误`n$key`r`n" -fore Yellow -back DarkRed
- } else {
- Write-Host "第 $($i+1) 行找不到`n$key`r`n" -fore Magenta -back DarkBlue
- }
- }
- }
- }
- }
- $Content | sc .\work.txt -enc Default
- CMD /C "echo;&pause" # 兼容 PS2.0
复制代码
========睡了会,精神多了===========
作者: WHY 时间: 2019-1-5 18:00
- @if(0)==(0) echo off
- cscript //nologo //e:jscript "%~f0" < 替换.txt
- pause & goto :EOF
- @end
-
- var n = 1;
- var fso = new ActiveXObject('Scripting.FileSystemObject');
- var str = fso.OpenTextFile('work.txt', 1).ReadAll();
-
- while(!WSH.StdIn.AtEndOfStream){
- var key1 = WSH.StdIn.ReadLine(), key2 = WSH.StdIn.ReadLine();
- var Len = str.split(key1).length;
- if (Len < 2) {
- WSH.Echo('第' + n + '行 无\n' + key1);
- } else if (Len == 2) {
- str = str.replace(key1, key2);
- } else {
- WSH.Echo('第' + n + '行 多处\n' + key1);
- }
- n += 2;
- }
- 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
- @if(0)==(0) echo off
- cscript //nologo //e:jscript "%~f0" < 替换.txt
- pause & goto :EOF
- @end
-
- var n = 1;
- var fso = new ActiveXObject('Scripting.FileSystemObject');
- var str = fso.OpenTextFile('work.txt', 1).ReadAll();
-
- while(!WSH.StdIn.AtEndOfStream){
- var key1 = WSH.StdIn.ReadLine(), key2 = WSH.StdIn.ReadLine();
- var arr = str.split(key1);
- var Len = arr.length;
- if (Len < 2) {
- WSH.Echo('第' + n + '行 无\n' + key1);
- } else {
- str = arr.join(key2);
- }
- n += 2;
- }
- 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 |