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

[文本处理] [已解决]如何根据一个文本列出的字符串替换关系式对另一个文本相应的字符串进行替换

本帖最后由 沸羊羊 于 2016-8-31 08:14 编辑

各位,我现在遇到个问题,想请教您一下:
我有两个txt文件,分别为a.txt,b.txt,a.txt里边内容格式为
111111,1
111111,2
111,1
而b.txt里面格式如:
aaa,s,aa,111111,ads,asd
aa,a,ad,111,sd,dd
现在我就是想读取a.txt的每一行数据,比如第一行,在b.txt中对应查找有没有111111,有的话,就将111111替换为1,需要注意的是,在b.txt中只有一行111111,但是a.txt中有两行111111,所以需要在b.txt中添加一行数据,并将111111替换为2,请问这个bat怎么写?
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

或者我想问下,能否先复制查找到的字符串所在行,再进行替换操作?

TOP

批处理 替换字符串

我现在有两个文件,分别是a.txt,b.txt
我想循环读取a.txt的每一行数据,然后在b.txt中,行一一对应的替换字符串(b.txt文件中,已经经过排序,所以是必定与a.txt中的数据一一对应的)
请问,这个bat脚本怎么写?文件格式见附件

TOP

回复 4# GNU


    大神,您的脚本确实实现了我的需求,不过我是新手,能不能麻烦您给我详细解释下各行的意思呢?万分感谢!

TOP

  1. @echo off
  2. rem setlocal enabledelayedexpansion
  3. if exist C:\"Program Files"\"aa bb"\test.txt del /q C:\"Program Files"\"aa bb"\test.txt
  4. if exist C:\"Program Files"\"aa bb"\c.txt del /q C:\"Program Files"\"aa bb"\c.txt
  5. set file=C:\Program Files\aa bb\a.txt
  6. set file2=C:\Program Files\aa bb\20160818_Export_c.txt
  7. set "tmpFile=C:\Program Files\aa bb\c.txt"
  8. set "dirFile=C:\Program Files\aa bb\test.txt"
  9. for /f "tokens=1,2 delims=," %%a in ("%file%") do (
  10. for /f "tokens=*" %%i in ('type "%file2%" ^| findstr %%a') do (
  11. echo %%i>>"%tmpFile%"
  12. )
  13. rem call :G_getrows "C:\Users\fan-17\Desktop\a.txt" kk
  14. )
  15. setlocal enabledelayedexpansion
  16. (for /f "tokens=1-8 delims=," %%a in ('type "%tmpFile%"') do (
  17.     set /p StrLine=
  18.     for /f "tokens=2 delims=," %%x in ("!StrLine!") do (
  19.         set StrCol=%%x
  20.     )
  21.     echo ,%%a,%%b,!StrCol!,%%d,%%e,%%f,%%g,%%h
  22. ))<"%file%" > "%dirFile%"
  23. if exist "%tmpFile%" del /q "%tmpFile%"
复制代码
回复 4# GNU


    您好,这是我结合您给的脚本,写的一个批处理,如果文件路径中没有空格,则可以执行,但是如果路径中有空格,就会提示找不到文件,我在网上找资料,说是只要在有空格的路径上加双引号就行,可是我加了之后还是没用,请您指教

TOP

本帖最后由 沸羊羊 于 2016-8-23 11:04 编辑

回复 8# GNU


    您好,根据您的脚本,执行后,发现报错,注释掉echo off,查看执行结果,发现 我的临时文件 c.txt 没有生成,这个是怎么回事?

我逐行执行脚本,发现  for /f "tokens=1,2 delims=," %%a in ("%file%") do (
echo %%a

这句话,输出的%%a 是个路径,而不是 文本内容的值,是不是双引号加的不对导致的?

TOP

回复 10# GNU


    谢谢,长知识,确实好用

TOP

本帖最后由 沸羊羊 于 2016-8-24 10:12 编辑

回复 10# GNU
  1. @echo off
  2. rem 号与号的对应文件
  3. set file=C:\Program Files\aa bb\a.txt
  4. rem 文件
  5. set file2=C:\Program Files\aa bb\20160818_Export_c.txt
  6. rem 生成的临时文件,最后会删掉
  7. set tmpFile=C:\Program Files\aa bb\c.txt
  8. rem 生成的新的文件
  9. set dirFile=C:\Program Files\aa bb\test.txt
  10. if exist "%tmpFile%" del /q "%tmpFile%"
  11. if exist "%dirFile%" del /q "%dirFile%"
  12. for /f "tokens=1,2 delims=," %%a in ('type "%file%"') do (
  13.     for /f "tokens=*" %%i in ('type "%file2%" ^| findstr %%a') do (
  14.         >>"%tmpFile%" echo %%i
  15.     )
  16. )
  17. setlocal enabledelayedexpansion
  18. (for /f "tokens=1-8 delims=," %%a in ('type "%tmpFile%"') do (
  19.     set /p StrLine=
  20.     for /f "tokens=2 delims=," %%x in ("!StrLine!") do (
  21.         set StrCol=%%x
  22.     )
  23.     echo ,%%a,%%b,!StrCol!,%%d,%%e,%%f,%%g,%%h
  24. ))<"%file%" > "%dirFile%"
  25. if exist "%tmpFile%" del /q "%tmpFile%"
复制代码
请问,如何在 'type "%file2%" ^| findstr %%a' 时,判断有没有查找到字符串呢?没有的话则跳过,有的话,则输出到临时文件中
还有,能不能一行行复制,而不是根据逗号分隔,再输出1-8列,这样就被限制死了。谢谢!

TOP

回复 14# GNU


    我试了下,确实可以,只是执行太慢,以为是卡死在那了,还有最后一个问题,能不能做到一行行的替换,而不是使用tokens=1-8,限定了输出列数?

TOP

回复  沸羊羊

没找到本来就不执行写入tmpfile,一行一行的替换需要考虑有两列及其以上的字段相同时,会 ...
xxpinqz 发表于 2016-8-24 13:18



    您好,如果不需要考虑有两列或以上字段相同的情况,能否做到行替换?谢谢

TOP

回复 17# GNU


    大神您好,暂时我还看不懂您写的脚本都是什么意思,但是行复制是做到了,但是你的脚本会把每行的字符串都替换掉,这样的话,我的“被替换”的字符串相同,“替换值”不同,就只替换了一个

可能表达的不是特清楚
a.txt                                  b.txt                                             临时文件
111111  1                          ,a,b,c,111111,s,f,g                        ,a,b,c,111111,s,f,g
111111   111                                                                        ,a,b,c,111111,s,f,g

由于 a.txt 中,有两个 111111 ,所以我现在生成的临时文件中,已经将b.txt中包含字符串“111111”的行做了复制
现在我就需要 一行将 “111111”替换为“1”,一行替换为“111”

或者我想到一个折中的办法,就是每次只替换查找到的第一个字符串,其余的都不替换,只是我不会写这个脚本,麻烦您了,谢谢!

TOP

本帖最后由 沸羊羊 于 2016-8-25 10:39 编辑

回复 19# GNU


    您好:
             代码执行结果是:在b.txt中,先查找到 “111111”,然后替换为“1”,再执行第二行,查找“111111”,此时,由于“111111”已经全部替换为“1”了,所以找不到,这样就是全部替换为“1”了
             我要的效果是: a.txt中,有几行包含“111111”的,就在b.txt中,复制包含“111111”的行,然后,根据a.txt中第二行的值,一一替换
             具体说明,可以看 我在18楼回复您时,临时文件的替换效果

TOP

回复 22# GNU

我就是想根据a.txt里面的数据,替换掉b.txt里面的字符串,然后生成test.txt,a.txt中的字符串,在b.txt中没有的话,就跳过

TOP

回复 22# GNU


    您好,我已经把文件和想要的效果发出,麻烦您给个脚本,急求,拜谢!

TOP

回复 25# happy886rr


    您好,第一:由于公司后台杀毒软件,我还没下载sed.exe,就给我直接删掉了
               第二:由于需要支持win7、win8、win xp,所以,sed 能全面支持吗?
               第三:sed.exe能不能支持静默安装?如果可以,我可以尝试在安装包中加入这个程序安装,然后再调用

TOP

返回列表