回复 523066680
你这打击新人的积极性么
zydrawer 发表于 2018-2-6 20:36
花了好久时间没有解决,说明这个事用批处理不方便,如果自己需要解决问题,而不是学习批处理,完全没有必要死磕批处理。
1.楼主用了2层for循环,每一行替换把key.txt要重新读取一边,效率低。
2.要使用延时变量,搞得代码变量使用要注意,对新手,基础不是很好的话,明明自己思路对的但是代码却不是按自己想的走。
3.如果KEY.TXT里面有某些特殊字符,set h2=!h1:%%i=%%j!的方式替换,导致语法错误出错,不能解决楼主问题。
如果把批处理当解决问题工具的话,有其他东西能简单搞定也愿意使用的话,文本,字符串处理交给别的脚本语言是正确的,系统自带的VBS也行,不过代码多些。
比如楼主的问题,用ruby脚本语言,不使用特殊用法刻意减少代码行数,纯粹按最简单的逻辑处理,使用基本语法,不到10行还简单明白。- text = File.read('findfile.txt') #读取全部内容保存到text变量
- kvlist = File.read('key.txt') #读取key.txt文件内容
- kvlist.each_line do |line| #并按行循环
- line = line.chomp #去掉末尾\r\n换行符
- if line.length > 0 #不是空行的话
- kv = line.split("\t") #Tab #按Tab分割得到KEY,VALUE数组
- text.gsub!(kv[0], kv[1]) #替换内容
- end
- end
- File.write('findfile_2.txt', text)
复制代码
问题:
我写的bat处理命令虽将字符串替换成功,但是也将没有替换的行也重复输出了,
花了好久时间也没有找到原因,拜托各位前辈大神了
zydrawer 发表于 2018-2-6 16:12
批处理很简单,一行一行走,查看每行的数据和自己的预期是否一致就能找出问题。
简单的调试方法:
findfile.txt只写简单的2行,key.txt先写2行。
abc def 123 456 777
abc 888 456 123
33 ccc
456 xxx
然后把echo off改成echo on,自己在cmd下运行看每行执行的结果,尤其是在输出文件前,可以自己echo单独看看。
echo xxx > b.txt => echo xxx b.txt
另外,大体一看有2处不是很明白,
if !h1! neq !h2!
为什么要判断替换后是否相同?
abc def 123 456 777找不到33没有替换为ccc那么它还是abc def 123 456 777,直接输出就行。
abc def 123 456 777再找到456替换为abc def 123 xxx 777,直接输出,为什么要判断找到与否?
if !num! == 0 (
为什么要记录替换次数?一行只替换一次么?比如abc 33 456的话,只把33替换为ccc,456就不再替换为xxx了是么?描述的需求里面没有体现。 |