中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-08-11 09:50
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [新手求助] 关于批处理数字和时间运算 查看 1,048 回复 8
楼 主 [新手求助] 关于批处理数字和时间运算 发表于 2009-02-23 13:23 ·  中国 浙江 温州 电信
初级用户
★★
积分 58
发帖 60
注册 2009-02-18 12:48
17年会员
UID 139163
性别 男
状态 离线
请论坛大们指点一下:

第一个问题:(已解决)

现有a.txt 内容如下:(有几万行)
100 aaaaaaaaa
120 aaaaaaaaa
122 aaaaaaaaa
138 aaaaaaaaa



要求对a.txt 批处理生成b.txt (第二行数字减第一行数字放置于第一行第二列)
100 20 aaaaaaaaa
120 2 aaaaaaaaa
122 16 aaaaaaaaa


如何才能做到呢? 这个问题已解决。谢谢3楼的朋友。


第二个问题:如果把数字改为时间呢?又怎么处理呢?

比如a.txt

04:23 aaaaaaaaa
6:50 aaaaaaaaa
10:32 aaaaaaaaa
15:30 aaaaaaaaa
18:40 aaaaaaaaa
20:00 aaaaaaaaa
23:50 aaaaaaaaa
00:30 aaaaaaaaaa
01:31 aaaaaaaaaa

生成b.txt (时间肯定是递增的,XX单位为分钟)

04:23 XX aaaaaaaaa
06:50 XX aaaaaaaaa
10:32 XX aaaaaaaaa
15:30 XX aaaaaaaaa
..
..



谢谢!

[ Last edited by sady2009 on 2009-2-23 at 21:10 ]
2 可以解决你的问题 发表于 2009-02-23 17:32 ·  美国 华盛顿州 金 雷德蒙德 Microsoft
初级用户
★★
积分 100
发帖 93
注册 2009-01-14 15:04
17年会员
UID 136661
性别 男
来自 湖南
状态 离线
复制这个代码,执行一下,可以解决你的问题,在我这里测试是通过的。

@echo off&setlocal EnableDelayedExpansion
set num1=0
set num2=0

for /f "delims= " %%i in (a.txt) do (
set var=%%i
if defined var goto begin
)

:begin
for /f "skip=1 delims= " %%i in (a.txt) do (
set bar=!var!
set var=%%i
set /a car=!var!-!bar!
echo !car!>>b.txt
)
set /a car=!bar!-!bar!
echo !car!>>b.txt
goto insert

:insert
for /f "tokens=1,2 delims= " %%a in (a.txt) do (
set /a num1+=1
for /f "delims=" %%i in (b.txt) do (
set /a num2+=1
if !num1!==!num2! echo %%a %%i %%b>>c.txt
)
set num2=0
)
del b.txt
endlocal
goto :eof
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
sady2009 +1 2009-02-23 18:37
3 发表于 2009-02-23 18:23 ·  中国 广西 百色 中移铁通
银牌会员
★★★
永远的菜鸟
积分 1,335
发帖 574
注册 2007-11-27 12:50
18年会员
UID 103929
性别 男
来自 广西
状态 离线
@echo off
Setlocal Enabledelayedexpansion
type nul>b.txt
set /a m=0,n=m-1
for /f "tokens=1,*" %%a in ('type a.txt') do (
set str!m!=%%a&set var!m!=%%b
if !m! gtr 0 (
set /a sth=str!m!-str!n!
>>b.txt call echo %%str!n!%% !sth! %%var!n!%%
)
set /a m+=1,n+=1
)
本帖最近评分记录 (共 2 条) 点击查看详情
评分人分数时间
sady2009 +1 2009-02-23 18:37
zhengqian529 +2 2009-02-23 18:58
4 发表于 2009-02-23 18:36 ·  中国 浙江 温州 龙湾区 电信
初级用户
★★
积分 58
发帖 60
注册 2009-02-18 12:48
17年会员
UID 139163
性别 男
状态 离线
非常感谢。2楼的朋友会生成多余的列。 3楼的代码非常好,生成的结果完全符合我的预期。
5 发表于 2009-02-23 21:11 ·  中国 浙江 温州 龙湾区 电信
初级用户
★★
积分 58
发帖 60
注册 2009-02-18 12:48
17年会员
UID 139163
性别 男
状态 离线
新增第二个问题,请大大们再指导一下。
6 Re 4楼 发表于 2009-02-23 21:12 ·  中国 重庆 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
如果有人帮你解决了问题,建议进行以下操作:

1、修改帖子标题,在标题最前面注明:[已结]

2、给竭尽所能帮你的人、正确回答问题的人加分(你自己的积分不会减少)以示感谢,虽然大家来论坛是为了学习而不是为了积分,但加分聊表谢意总是或多或少能够让花费了时间和精力无私帮助你的人略感欣慰。

3、如果你是在别人的提示下自己写出了代码,请把自己的方法贴出来跟大家分享一下,也许他人可以帮你指出代码中的不足之处、告诉你如何提高执行效率等,有交流才能更快地进步。
7 发表于 2009-02-23 22:08 ·  中国 广东 东莞 电信
银牌会员
★★★
批处理编程迷
积分 1,916
发帖 752
注册 2008-12-28 04:30
17年会员
UID 135147
性别 男
来自 广西
状态 离线
::时间相减

set strm=str!m!&set strn=str!n!
set/a sth=1!strm:~0,2!-1!strn:~0,2!
set/a sti=1!strm:~3!-1!strn:~3!
set/a sth=(sth-sti/60)*60+sti-sti/60*40
精简
=> 个人网志
8 发表于 2009-02-24 09:20 ·  中国 浙江 温州 龙湾区 电信
初级用户
★★
积分 58
发帖 60
注册 2009-02-18 12:48
17年会员
UID 139163
性别 男
状态 离线
谢谢楼上的朋友指点。

自己也写了一个。先把时间转为分钟. 为了判断开头是零的问题,写了大段代码。想不到在前面加个数字就可以解决了,真是妙极了。

不过,有个问题。 比如: 如果是00:20-23:20 就会出错了,有办法解决24小时之外的时间运算吗?
9 Re 8楼 发表于 2009-02-24 11:25 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
批处理函数库里面有计算时间的方法
http://www.cn-dos.net/forum/viewthread.php?tid=45204
论坛跳转: