[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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

回复 3# 沸羊羊
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "tokens=1-8 delims=," %%a in ('type "b.txt"') do (
  4.     set /p StrLine=
  5.     for /f "tokens=2 delims=," %%x in ("!StrLine!") do (
  6.         set StrCol=%%x
  7.     )
  8.     echo ,%%a,%%b,!StrCol!,%%d,%%e,%%f,%%g,%%h
  9. ))<"a.txt" > "c.txt"
复制代码

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

回复 6# 沸羊羊


一个路径加一对双引号就够了。
  1. if exist "C:\Program Files\aa bb\test.txt" del /q "C:\Program Files\aa bb\test.txt"
复制代码

TOP

  1. @echo off
  2. set "file=C:\Program Files\aa bb\a.txt"
  3. set "file2=C:\Program Files\aa bb\20160818_Export_c.txt"
  4. set "tmpFile=C:\Program Files\aa bb\c.txt"
  5. set "dirFile=C:\Program Files\aa bb\test.txt"
  6. if exist "%tmpFile%" del /q "%tmpFile%"
  7. if exist "%dirFile%" del /q "%dirFile%"
  8. for /f "tokens=1,2 delims=," %%a in ("%file%") do (
  9.     for /f "tokens=*" %%i in ('type "%file2%" ^| findstr %%a') do (
  10.         >>"%tmpFile%" echo %%i
  11.     )
  12.     rem call :G_getrows "C:\Users\fan-17\Desktop\a.txt" kk
  13. )
  14. setlocal enabledelayedexpansion
  15. (for /f "tokens=1-8 delims=," %%a in ('type "%tmpFile%"') do (
  16.     set /p StrLine=
  17.     for /f "tokens=2 delims=," %%x in ("!StrLine!") do (
  18.         set StrCol=%%x
  19.     )
  20.     echo ,%%a,%%b,!StrCol!,%%d,%%e,%%f,%%g,%%h
  21. ))<"%file%" > "%dirFile%"
  22. if exist "%tmpFile%" del /q "%tmpFile%"
复制代码
如果这个代码还是报错,你可以把 @echo off 删掉,在CMD窗口执行 test.bat 这样可以看到具体是哪里在报错。

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

回复 9# 沸羊羊


那种写法会导致 for 命令认为 "%file%" 是个字符串而不是一个文件
改成这样试试:
for /f "tokens=1,2 delims=," %%a in ('type "%file%"') do (

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

回复 12# 沸羊羊

没找到本来就不执行写入tmpfile,一行一行的替换需要考虑有两列及其以上的字段相同时,会替换其它的值。
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

回复 12# 沸羊羊


判断有没有查找到字符串呢?没有的话则跳过,有的话,则输出到临时文件中

代码14行到16行就是为了实现这个功能

TOP

回复 14# GNU


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

TOP

返回列表