Board logo

标题: 批处理上下行处理与变量延迟练习 [打印本页]

作者: cjiabing    时间: 2010-11-11 13:38     标题: 批处理上下行处理与变量延迟练习

因在这个问题上吃过好多次亏,特地挑来给新手练习。
题目:
有一文本 1.txt ,内容是五行数字:
  1. 50
  2. 50
  3. 1242
  4. 9979900
  5. 7
复制代码
要求:
1、求这五行数字的总和;
2、一次显示相邻的上下两行数字;
3、比较上下行异同,提取重复部分,或过滤掉重复的内容。
其中,第三题其它地方有,可以选做,没做过的建议做做。
提示
  1. 1、在一个FOR的循环中,FOR解析文本的时候,通常一次只显示一行内容,无法同时显示两行或两行以上的内容。
  2. 2、在FOR中设置变量,除了环境变量等系统设定好的变量外,一般的变量会被抛弃,除非将变量的百分号改成感叹号。此时的变量在遇到endlocal之前可以全局通用,甚至在FOR的循环中通用。
  3. 3、开启变量延迟后,利用FOR循环前后时间点来设置变量,可同时得到这两个时间点上的变量,一个是新设的变量(现在——本次——当前行),一个是延迟下来的变量(过去——上次——上一行),它们代表的正是文本中的上下行。
复制代码


[ 本帖最后由 cjiabing 于 2010-11-11 13:46 编辑 ]
作者: cjiabing    时间: 2010-11-12 21:10

  1. @echo off & setlocal enableextensions enabledelayedexpansion
  2. ::求总和
  3. set str=
  4. for /f %%a in (1.txt) do (
  5. set mum=!str!
  6. set str=%%a
  7. set /a var=!mum!+%%a
  8. set str=!var!
  9. )
  10. echo !var!
  11. pause
  12. @echo off & setlocal enableextensions enabledelayedexpansion
  13. ::同时显示上下行
  14. for /f %%a in (1.txt) do (
  15. echo !ddr! %%a
  16. set ddr=%%a
  17. )
  18. pause
  19. @echo off & setlocal enableextensions enabledelayedexpansion
  20. ::提取上下行相同部分
  21. for /f %%a in (1.txt) do (
  22. if !bar!==%%a echo %%a
  23. set bar=%%a
  24. )
  25. pause
  26. @echo off & setlocal enableextensions enabledelayedexpansion
  27. ::过滤上下行重复(相同)部分
  28. for /f %%a in (1.txt) do (
  29. if not !jar! == %%a echo %%a
  30. set jar=%%a
  31. )
  32. pause
复制代码


[ 本帖最后由 cjiabing 于 2010-11-12 21:16 编辑 ]
作者: skuny    时间: 2010-12-23 00:51

  1. @echo off
  2. set /a a=0
  3. for /f %%i in (1.txt) do (
  4. set /a a=a+%%i
  5. )
  6. echo %a%
  7. pause
复制代码

作者: skuny    时间: 2010-12-23 01:00

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a a=0
  4. for /f %%i in (1.txt) do (
  5. set /a a+=1
  6. if !a! gtr 1 echo !b! %%i
  7. set b=%%i
  8. )
  9. endlocal
  10. pause
复制代码

作者: ithinkican    时间: 2010-12-23 09:53

什么意思这是…
作者: skuny    时间: 2010-12-23 11:14

  1. ::不是比较上下两行,而是比较全部内容
  2. @echo off
  3. setlocal enabledelayedexpansion
  4. for /f %%i in (1.txt) do (
  5. set /a b=0
  6. for /f %%j in (1.txt) do (
  7. if %%i == %%j (set /a b+=1)
  8. )
  9. if !b! gtr 1 echo %%i 重复!b!次
  10. if !b! == 1 echo 单一的数字为:%%i
  11. )
  12. endlocal
  13. pause
复制代码

作者: mac007cn    时间: 2010-12-23 23:28

今天下午看到的这个题目,有点意思。23点俺家霖霖终于睡着了。简单思考了一下,实现了前两步;第三步貌似麻烦,以后再说吧。睡了,明天还得早起呢。
  1. ::问题出处:http://www.bathome.net/thread-9936-1-1.html
  2. ::批处理上下行处理与变量延迟练习。XP SP3 CMD测试通过。
  3. ::有一文本 1.txt ,内容是五行数字:
  4. :: 50
  5. :: 50
  6. :: 1242
  7. :: 9979900
  8. :: 7
  9. ::要求:1、求这五行数字的总和;2、一次显示相邻的上下两行数字;
  10. ::3、比较上下行异同,提取重复部分,或过滤掉重复的内容。其中,
  11. ::第三题其它地方有,可以选做,没做过的建议做做。
  12. @echo off
  13. setlocal enableextensions
  14. setlocal enabledelayedexpansion
  15. set /a sum=0
  16. set "str0="
  17. set "str="
  18. for /f %%a in (1.txt) do (
  19. set /a sum+=%%a
  20. set "str0=!str!"
  21. set "str=%%a"
  22. echo.
  23. echo 上一行:!str0!
  24. echo 当前行:!str!
  25. )
  26. echo.
  27. echo 总和:%sum%
  28. echo.
复制代码

作者: wolonga123    时间: 2011-1-15 14:45

  1. @echo off
  2. set /a sum=0
  3. for /f %%i in (1.txt) do ( set /a sum+=%%i )
  4. echo %sum%
  5. pause
复制代码

作者: Hello123World    时间: 2011-7-19 17:58

  1. @echo off & setlocal enableextensions enabledelayedexpansion
  2. ::同时显示上下行
  3. for /f %%a in (1.txt) do (
  4. echo !ddr! %%a
  5. set ddr=%%a
  6. )
  7. pause
复制代码
这个同时显示上下两行的代码让我实在无语,第一行只显示了第一行……
还有就是楼主自己的算法太多余,这种加法用的着变量延迟吗?
  1. @echo off
  2. for /f %%i in (1.txt) do Set /a a=a+%%i
  3. echo %a%
  4. pause
复制代码

作者: cjiabing    时间: 2011-7-19 18:13

本帖最后由 cjiabing 于 2011-7-19 18:39 编辑

9# Hello123World 呵呵,以前不懂写的,然后复制粘贴,复制粘贴……
上下行数据关系:
  1. @echo off & setlocal enableextensions enabledelayedexpansion
  2. for /f %%i in (1.txt) do (
  3. Set /a a=a+%%i
  4. if not "!b!"=="" echo 显示上行:!b!;下行:%%i
  5. if /i %%i==!b! echo 显示相同行:!b!
  6. set b=%%i
  7. )
  8. echo 显示累加总和:!a!
  9. pause
复制代码

作者: 尘丶    时间: 2015-8-10 18:02

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (1.txt) do set /a num=!num!+%%a
  3. echo;!num!
  4. pause
复制代码
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (1.txt) do (
  3. echo;%%a
  4. echo;!num!
  5. set num=%%a
  6. )
  7. pause
复制代码
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (1.txt) do (
  3. findstr "%%a" 2.txt>nul 2>nul||echo;%%a>>2.txt
  4. )
  5. pause
复制代码
前面好像出过类型的
作者: 尘丶    时间: 2015-8-10 18:02

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (1.txt) do set /a num=!num!+%%a
  3. echo;!num!
  4. pause
复制代码
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (1.txt) do (
  3. echo;%%a
  4. echo;!num!
  5. set num=%%a
  6. )
  7. pause
复制代码
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (1.txt) do (
  3. findstr "%%a" 2.txt>nul 2>nul||echo;%%a>>2.txt
  4. )
  5. pause
复制代码
前面好像出过类型的




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