Board logo

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

作者: jian123ch    时间: 2014-10-12 14:39     标题: 【已解决】批处理命令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 "男"这句好象有问题。但是问题在呢一直不明白,还请各位大虾帮分析指正。
作者: Batcher    时间: 2014-10-12 14:56

  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
复制代码

作者: apang    时间: 2014-10-12 16:13

本帖最后由 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)
复制代码

作者: jian123ch    时间: 2014-10-12 16:15

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


您好!请问"&","&&"与"||"这些组合命令在代码中使用时的优先级顺序是怎样的?
作者: Batcher    时间: 2014-10-12 16:16

回复 4# jian123ch


    你可以先自己做几个试验看看
作者: jian123ch    时间: 2014-10-12 16:17

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

纯粹的代码练习呀!您多想了哈。。。
作者: jian123ch    时间: 2014-10-12 16:22

回复 5# Batcher

实验了几个不同的组合,貌似“&”,“&&”与“||”这间的优先级是相同的。
作者: terse    时间: 2014-10-12 16:22

回复 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
复制代码

作者: jian123ch    时间: 2014-10-12 16:38

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


好象你的代码执行结果与原题也有一些偏差,原来为“男”,则可以正常替换为“女”,可是原来为“女”则不能替换为“男”
作者: jian123ch    时间: 2014-10-12 17:06

本帖最后由 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”命令;哦。呵。。呵。。这道的是有点儿变态的哦。
作者: jian123ch    时间: 2014-10-12 17:08

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

  1. set flagstr=@echo !strtmp!^|find /c "男"
复制代码
这行代码只会给flagstr赋值"@echo !strtmp!^|find /c "男"",而不是它的返回值
作者: jian123ch    时间: 2014-10-12 18:20

回复 12# bailong360
没错!的确如此,但是我一直找不到更好的方法来解决他。难道只能绕过find命令吗?
作者: terse    时间: 2014-10-12 18:27

本帖最后由 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
复制代码

作者: Batcher    时间: 2014-10-12 18:42

回复 9# jian123ch


    我这里测试没有问题,是不是你抄错代码了。
作者: jian123ch    时间: 2014-10-12 19:21

回复 14# terse

不知道怎么回事,我的代码中必须这样写
  1. echo !strtmp!| find /c "男" >nul&& set strtmp=!strtmp:男=女!||set strtmp=!strtmp:女=男!
复制代码
即必须是"!strtmp:男=女!",而不能是"!strtmp: 男 = 女 !",否则执行的结果就不能。一旦加了空格就不对了!是不是我的系统是Win7的系统呀!
作者: apang    时间: 2014-10-12 19:40

回复 16# jian123ch


    把空格换成跳格(Tab)试下呢?
作者: DAIC    时间: 2014-10-12 20:30

回复 16# jian123ch


    这跟操作系统没有任何关系。你的文本里面是空格,脚本里面就可以用空格;文本里面是制表符,脚本里面必须用制表符。
作者: bailong360    时间: 2014-10-12 21:38

回复 13# jian123ch


    你可以用&& || 或者errorlevel来判断
errorlevel一般0成功,1失败
作者: jian123ch    时间: 2014-10-13 09:20

回复 8# terse
你好,你的代码中下面这名
  1. if "!strtmp: 男 = 女 !" == "!strtmp!" (set strtmp=!strtmp: 女 = 男 !) else set strtmp=!strtmp: 男 = 女 !
复制代码
我有点不清楚,if "!strtmp: 男 = 女 !" == "!strtmp!" 当中的“”为什么这样用?能说明一下码?我想很多菜鸟不是很清楚。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2