标题: [文本处理] 【已解决】批处理命令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,我写的代码如下:- @echo off
- setlocal enabledelayedexpansion
- if exist test3.txt del test3.txt
- for /f "delims=" %%i in (test2.txt) do (
- set strtmp=%%i
- set flagstr=@echo !strtmp!^|find /c "男"
- if !flagstr!==1 set strtmp=!strtmp:男=女! else set strtmp=!strtmp:女=男!
- @echo !strtmp!>>test3.txt
- )
- type test3.txt
复制代码
可是一直没有生成理想中的文件。经过逐名排查,发现在批处里文件中运行set flagstr=@echo !strtmp!^|find /c "男"这句好象有问题。但是问题在呢一直不明白,还请各位大虾帮分析指正。
作者: Batcher 时间: 2014-10-12 14:56
- @echo off
- setlocal enabledelayedexpansion
- (for /f "delims=" %%i in (test2.txt) do (
- set "strtmp=%%i"
- echo,!strtmp! | find "男" >nul && set "strtmp=!strtmp:男=女!" || set "strtmp=!strtmp:女=男!"
- echo,!strtmp!
- ))>test3.txt
- type test3.txt
复制代码
作者: apang 时间: 2014-10-12 16:13
本帖最后由 apang 于 2014-10-12 19:49 编辑
看起来好猥琐:- @set @n=0;//&cscript -nologo -e:jscript "%~0"<a.txt>b.txt & pause & exit
-
- txt = WScript.StdIn.Readall(); s = "男女男";
- txt = txt.replace(/([男女])([^男女]*)$/mg,
- function(s0,s1,s2) {
- return s.substr(s.indexOf(s1)+1, 1) + s2;
- }
- )
- 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
这样会处理姓名里含有的"男"
改下一楼第七行
代码里"男"和"女" 左右空格是你实际文件分隔符- @echo off
- setlocal enabledelayedexpansion
- (for /f "delims=" %%i in (test2.txt) do (
- set strtmp=%%i
- if "!strtmp: 男 = 女 !" == "!strtmp!" (set strtmp=!strtmp: 女 = 男 !) else set strtmp=!strtmp: 男 = 女 !
- echo !strtmp!
- ))>test3.txt
- 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
- 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楼代码不替换吗?我这里测试通过的啊- @echo off&setlocal enabledelayedexpansion
- (for /f "delims=" %%i in (test2.txt) do (
- set strtmp=%%i
- echo !strtmp!| find " 男 " >nul&& set strtmp=!strtmp: 男 = 女 !||set strtmp=!strtmp: 女 = 男 !
- echo !strtmp!
- ))>test3.txt
- type test3.txt
- pause
复制代码
加 /C- @echo off & setlocal enabledelayedexpansion
- (for /f "delims=" %%i in (test2.txt) do (
- set strtmp=%%i
- for /f %%j in ('echo !strtmp!^|find /c " 男 "') do set flagstr=%%j
- if !flagstr! == 1 (set strtmp=!strtmp: 男 = 女 !) else set strtmp=!strtmp: 女 = 男 !
- echo !strtmp!
- ))>test3.txt
- type test3.txt
- pause
复制代码
作者: Batcher 时间: 2014-10-12 18:42
回复 9# jian123ch
我这里测试没有问题,是不是你抄错代码了。
作者: jian123ch 时间: 2014-10-12 19:21
回复 14# terse
不知道怎么回事,我的代码中必须这样写- 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
你好,你的代码中下面这名- if "!strtmp: 男 = 女 !" == "!strtmp!" (set strtmp=!strtmp: 女 = 男 !) else set strtmp=!strtmp: 男 = 女 !
复制代码
我有点不清楚,if "!strtmp: 男 = 女 !" == "!strtmp!" 当中的“”为什么这样用?能说明一下码?我想很多菜鸟不是很清楚。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |