返回列表 发帖

批处理上下行处理与变量延迟练习

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


[ 本帖最后由 cjiabing 于 2010-11-11 13:46 编辑 ]
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

@echo off & setlocal enableextensions enabledelayedexpansion
::求总和
set str=
for /f %%a in (1.txt) do (
set mum=!str!
set str=%%a
set /a var=!mum!+%%a
set str=!var!
)
echo !var!
pause
@echo off & setlocal enableextensions enabledelayedexpansion
::同时显示上下行
for /f %%a in (1.txt) do (
echo !ddr! %%a
set ddr=%%a
)
pause
@echo off & setlocal enableextensions enabledelayedexpansion
::提取上下行相同部分
for /f %%a in (1.txt) do (
if !bar!==%%a echo %%a
set bar=%%a
)
pause
@echo off & setlocal enableextensions enabledelayedexpansion
::过滤上下行重复(相同)部分
for /f %%a in (1.txt) do (
if not !jar! == %%a echo %%a
set jar=%%a
)
pauseCOPY


[ 本帖最后由 cjiabing 于 2010-11-12 21:16 编辑 ]
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

@echo off
set /a a=0
for /f %%i in (1.txt) do (
set /a a=a+%%i
)
echo %a%
pauseCOPY

TOP

@echo off
setlocal enabledelayedexpansion
set /a a=0
for /f %%i in (1.txt) do (
set /a a+=1
if !a! gtr 1 echo !b! %%i
set b=%%i
)
endlocal
pauseCOPY

TOP

什么意思这是…

TOP

::不是比较上下两行,而是比较全部内容
@echo off
setlocal enabledelayedexpansion
for /f %%i in (1.txt) do (
set /a b=0
for /f %%j in (1.txt) do (
if %%i == %%j (set /a b+=1)
)
if !b! gtr 1 echo %%i 重复!b!
if !b! == 1 echo 单一的数字为:%%i
)
endlocal
pauseCOPY

TOP

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

TOP

@echo off
set /a sum=0
for /f %%i in (1.txt) do ( set /a sum+=%%i )
echo %sum%
pauseCOPY

TOP

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

TOP

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

9# Hello123World 呵呵,以前不懂写的,然后复制粘贴,复制粘贴……
上下行数据关系:
@echo off & setlocal enableextensions enabledelayedexpansion
for /f %%i in (1.txt) do (
Set /a a=a+%%i
if not "!b!"=="" echo 显示上行:!b!;下行:%%i
if /i %%i==!b! echo 显示相同行:!b!
set b=%%i
)
echo 显示累加总和:!a!
pauseCOPY
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in (1.txt) do set /a num=!num!+%%a
echo;!num!
pauseCOPY
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in (1.txt) do (
echo;%%a
echo;!num!
set num=%%a
)
pauseCOPY
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in (1.txt) do (
findstr "%%a" 2.txt>nul 2>nul||echo;%%a>>2.txt
)
pauseCOPY
前面好像出过类型的

TOP

@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in (1.txt) do set /a num=!num!+%%a
echo;!num!
pauseCOPY
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in (1.txt) do (
echo;%%a
echo;!num!
set num=%%a
)
pauseCOPY
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in (1.txt) do (
findstr "%%a" 2.txt>nul 2>nul||echo;%%a>>2.txt
)
pauseCOPY
前面好像出过类型的

TOP

返回列表