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

[文本处理] 【已解决】批处理命令set与find组合赋值的问题,本题的有点儿变态,要用到find命令

本帖最后由 jian123ch 于 2014-10-12 19:22 编辑

有一名为test2.txt的文本,内容如下:
37        赵大        男        18        14.5        34        24        90.5        1
13        钱二二        男        18        15        34.5        22        89.5        2
11        孙小小        女        16        15.5        30.5        27        89        3
14        李四四        女        18        15        30.5        23        86.5        4
15        张三三        男        16        16        31        23        86        5
9        李四七        女        18        12        32        23        85        6
35        王二小        男        18        15        28.5        23        84.5        7
要将文中性别全部更换,如果是“男”,就换成“女”;如果是“女”则更换成“男”,然后生成新的文件test3.txt,我写的代码如下:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. if exist test3.txt del test3.txt
  4. for /f "delims=" %%i in (test2.txt) do (
  5. set strtmp=%%i
  6. set flagstr=@echo !strtmp!^|find /c "男"
  7. if !flagstr!==1 set strtmp=!strtmp:男=女! else set strtmp=!strtmp:女=男!
  8. @echo !strtmp!>>test3.txt
  9. )
  10. type test3.txt
复制代码
可是一直没有生成理想中的文件。经过逐名排查,发现在批处里文件中运行set flagstr=@echo !strtmp!^|find /c "男"这句好象有问题。但是问题在呢一直不明白,还请各位大虾帮分析指正。

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "delims=" %%i in (test2.txt) do (
  4.     set "strtmp=%%i"
  5.     echo,!strtmp! | find "男" >nul && set "strtmp=!strtmp:男=女!" || set "strtmp=!strtmp:女=男!"
  6.     echo,!strtmp!
  7. ))>test3.txt
  8. type test3.txt
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 apang 于 2014-10-12 19:49 编辑

看起来好猥琐:
  1. @set @n=0;//&cscript -nologo -e:jscript "%~0"<a.txt>b.txt & pause & exit
  2. txt = WScript.StdIn.Readall(); s = "男女男";
  3. txt = txt.replace(/([男女])([^男女]*)$/mg,
  4.     function(s0,s1,s2) {
  5.         return s.substr(s.indexOf(s1)+1, 1) + s2;
  6.     }
  7. )
  8. WScript.StdOut.Write(txt)
复制代码

TOP

Batcher 发表于 2014-10-12 14:56


您好!请问"&","&&"与"||"这些组合命令在代码中使用时的优先级顺序是怎样的?

TOP

回复 4# jian123ch


    你可以先自己做几个试验看看
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

看起来好猥琐:
apang 发表于 2014-10-12 16:13

纯粹的代码练习呀!您多想了哈。。。

TOP

回复 5# Batcher

实验了几个不同的组合,貌似“&”,“&&”与“||”这间的优先级是相同的。

TOP

回复 1# jian123ch
这样会处理姓名里含有的"男"
改下一楼第七行
代码里"男"和"女" 左右空格是你实际文件分隔符
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "delims=" %%i in (test2.txt) do (
  4.      set strtmp=%%i
  5.      if "!strtmp: 男 = 女 !" == "!strtmp!" (set strtmp=!strtmp: 女 = 男 !) else set strtmp=!strtmp: 男 = 女 !
  6.      echo !strtmp!
  7. ))>test3.txt
  8. type test3.txt
复制代码

TOP

Batcher 发表于 2014-10-12 14:56


好象你的代码执行结果与原题也有一些偏差,原来为“男”,则可以正常替换为“女”,可是原来为“女”则不能替换为“男”

TOP

本帖最后由 jian123ch 于 2014-10-12 18:20 编辑

回复 8# terse
您好,如果将if "!strtmp: 男 = 女 !" == "!strtmp!" (set strtmp=!strtmp: 女 = 男 !) else set strtmp=!strtmp: 男 = 女 !这句代码修改成if "!strtmp:男=女!"=="!strtmp!" (set strtmp=!strtmp:女=男!) else set strtmp=!strtmp:男=女!
这样运行的结果才对。可是您的解题思想的确很巧,但是与原题的要求还是有点儿偏差,您这里没有用到“find”命令;哦。呵。。呵。。这道的是有点儿变态的哦。

TOP

回复 3# apang
这题是有点儿变态,呵。。呵。。题目的本意是要用到find命令,您的解法是调用了“WScript”对象,这是一个比较高端应用的解法。呵。。呵。。本人还没有学习到呀!

TOP

  1. set flagstr=@echo !strtmp!^|find /c "男"
复制代码
这行代码只会给flagstr赋值"@echo !strtmp!^|find /c "男"",而不是它的返回值

TOP

回复 12# bailong360
没错!的确如此,但是我一直找不到更好的方法来解决他。难道只能绕过find命令吗?

TOP

本帖最后由 terse 于 2014-10-12 18:37 编辑

回复 12# bailong360
非要用FIND的话 你确定2楼代码不替换吗?我这里测试通过的啊
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%i in (test2.txt) do (
  3.     set strtmp=%%i
  4.     echo !strtmp!| find  " 男 " >nul&& set strtmp=!strtmp: 男 = 女 !||set strtmp=!strtmp: 女 = 男 !
  5.     echo !strtmp!
  6. ))>test3.txt
  7. type test3.txt
  8. pause
复制代码
加 /C
  1. @echo off & setlocal enabledelayedexpansion
  2. (for /f "delims=" %%i in (test2.txt) do (
  3.      set strtmp=%%i
  4.      for /f %%j in ('echo !strtmp!^|find /c " 男 "') do set flagstr=%%j
  5.      if !flagstr! == 1 (set strtmp=!strtmp: 男 = 女 !) else set strtmp=!strtmp: 女 = 男 !
  6.      echo !strtmp!
  7. ))>test3.txt
  8. type test3.txt
  9. pause
复制代码

TOP

回复 9# jian123ch


    我这里测试没有问题,是不是你抄错代码了。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表