[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [求助]利用批处理计算时间差及代码修正

  1. 例:目标文件
  2. 电视台 开始时间 节目名称 开始时间 节目名称 开始时间 节目名称
  3. 电视台一 22:44 节目一 22:50 节目二 0:20 节目三
  4. 电视台二 22:00 节目一 23:35 节目二 1:35 节目三
复制代码
  1. 例:希望达成的目标
  2. 电视台 开始时间 节目名称 节目类型 节目时长 开始时间 节目名称 节目类型 节目时长 开始时间 节目名称 节目类型 节目时长
  3. 电视台一 2008-7-28 22:44 节目一 6 2008-7-28 22:50 节目二 90 2008-7-29 0:20 节目三 xx
  4. 电视台二 2008-7-28 22:00 节目一 95 2008-7-28 23:35 节目二 120 2008-7-28 1:35 节目三 xx
复制代码

  1. @echo off&setlocal enabledelayedexpansion
  2. set word=开始时间 节目名称 节目类型 节目时长
  3. echo %word%%word%%word%%word%%word%%word%%word%%word%%word%%word%%word%%word%%word%%word%%word%%word%%word%%word%%word%%word%%word%%word%%word%%word%%word%%word%%word%%word%%word%%word%%word%>a.txt
  4. for /f "skip=1 delims=" %%a in (letter.txt) do (
  5. for %%i in (%%a) do (
  6. set "str=%%i"
  7. if "!str:*:=!" neq "%%i" (
  8. set /a n+=1,x=n-1
  9. set .!n!=%%i&call :lp
  10. )
  11. if "!str!" neq "节目四" (set /p=!str! >a.txt) else (set /p=xxxx>a.txt)
  12. )
  13. echo.>>a.txt&set "n=0"&set "num=0"
  14. )
  15. start a.txt&goto :eof
  16. :lp
  17. for /f "tokens=1,2 delims=:" %%i in ("!.%x%!") do set "s1=%%i"&set "m1=%%j"
  18. for /f "tokens=1,2 delims=:" %%i in ("!.%n%!") do set "s2=%%i"&set "m2=%%j"
  19. set /a s=100%s2%%%100-100%s1%%%100,m=100%m2%%%100-100%m1%%%100
  20. if %s% lss 0 set /a s+=24
  21. if %m% lss 0 set /a s-=1,m+=60
  22. set /a m=s*60+m
  23. if %n% neq 1 set "str= %m% %str%"
复制代码


由于工作原因,我要收集一下各电视台播放节目的时间段及时长
在计算时长方面,很考验数学能力。。。

我希望能够达成几个目的
1、利用set /p=xxxx(日期格式),把xxxx传递给目标文件中每一个时间,例如,使“6:54”变成“2008-7-27 6:54”,而“2008-7-27 ”是我输入的。
Q1、如果加入我设定的日期,那么BAT如何判断当时间为第二天的0时以后的时间呢?这样的话“23:59”和第二天的“0:01”变成了“2008-7-27 23:59”,“2008-7-27 0:01”,要如何判断呢?(我把每一个XLS表整理为当天的节目表,所以要加入日期来方便导入数据库)
2、在节目名称中含有英文半角下的引号,冒号或空格等符号时,批处理会出错(把这些符号都变成制表符,使我下一步要复制到XLS中的计划受阻)

求达人指点
谢谢

兄弟这个好像越搞越复杂了,日期的计算是相当复杂的(尤其开始是你自己输入的时间),思考中。。。。

[ 本帖最后由 batman 于 2008-7-28 10:03 编辑 ]
***共同提高***

TOP

  想问一下楼主,每行有多少列?是固定列数吗?是不是只统计当天及下一天的?当天的是从几点开始——如果不知道当天从几点开始的话,那么,就难以区分0点是当天的还是下一天的。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

后面的时间肯定比前面的时间要大
如果是先0:00 再1:00,那么1:00-0:00=60
如果是先1:00再0:00,那么0:00-1:00=1380

TOP

  楼主还是一次性把我在2楼的问题都回答完吧,我好写代码。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

原帖由 namejm 于 2008-7-28 10:41 发表
  楼主还是一次性把我在2楼的问题都回答完吧,我好写代码。


(1)每行列数:不固定
(2)只统计当天和下一天的
(3)几点开始:不固定
下一个变量永远要比上一个大,如果没有上一个大,就加24H,这样考虑可以么?
还有一个重要的问题,一碰到半角下的符号就自动把符号替换为TABLE制表符了

比如有的节目是 “19:00 厨房:爱情”,在运行上面代码后就变成了“19:00 厨房 爱情”这个要怎么解决?(优先要解决的这一部分,时间实在不可以的话我就手动批量加吧,现在在做资料整理,如果多出制表符,在EXCEL里我还要手动一个个去找哪个多了去删除,很头痛)

[ 本帖最后由 奇然无双 于 2008-7-28 13:24 编辑 ]

TOP

  对了,那个节目类型的数据是怎么来的?说说规律吧。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

原帖由 namejm 于 2008-7-28 16:34 发表
  对了,那个节目类型的数据是怎么来的?说说规律吧。


类型这个,正是我头痛的地方
我要一个节目一个节目去看,再去手动分成不分的类别
目前来看我计划把所有的节目划分为以下22种类

1        体育
2        新闻
3        综合
4        电影
5        军事
6        科学自然
7        生活人文
8        少儿动漫
9        教育法制
10        财经
11        戏曲
14        其他
15        购物
16        电视剧
17        视频
18        政法
19        女性
20        文艺
21        娱乐
22        其他

在本周需要把所有我手上的节目表都划分好节目类别
应该每个电视台每一周的节目表形式都差不太多吧
下周可能会少些工作量
我在想能否我本周划分过分类的节目,统一存储在某一个文件中
到下周时能够先用这个文件做对比,如果找到相同名称,就把对应的分类直接放在节目分类一栏
如果没找到,就为空,等我手动划分
这个顺序我还没想好,有这么一个初步的概念

没有概念,说的很乱,希望哥们儿能够理解我说的话

TOP

本来我都快写好了,现在一看还是不合楼主要求啊
***共同提高***

TOP

  如果某个台的某个节目是固定的类型的话,完全可以做一张类型表出来,自动汇总到总表中去。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

原帖由 batman 于 2008-7-29 10:50 发表
本来我都快写好了,现在一看还是不合楼主要求啊

谢谢哥们儿了,不好意思,这问题有点头痛,但别为了我这点事耽误大家正常的工作和生活。


原帖由 namejm 于 2008-7-29 11:06 发表
  如果某个台的某个节目是固定的类型的话,完全可以做一张类型表出来,自动汇总到总表中去。

应该是这样的,如果我曾经划分过某台的某个节目,就应该固定这个节目的类型了。

TOP

我知道批处理来处理日期很复杂,实在不行的话就把我输入的日期看做常数吧
20080728,就让他+1=20080729
如果20080731再+1=20080732也无所谓
我再做一次替换,set 20080732=20080801就得了
反正一次只计算当日和+一天的日期
再过一天就是0801+1=0802的计算了
无所谓

TOP

没有计算合理日期:
  1. @echo off&color 1f&setlocal enabledelayedexpansion
  2. :begin
  3. set "days=%date:~,-4%"
  4. cls&echo.&echo 请在下面输入初始日期(格式为2008-07-08,默认为当天)
  5. echo.&set /p days=^=^>
  6. if "%days:~4,1%%days:~7,1%" neq "--" echo.&echo 请正确输入&ping /n 2 127.1>nul&goto begin
  7. set /p str=<1.txt
  8. for %%i in (%str%) do if "%%i" equ "开始时间" set /a num+=1
  9. cls&set /p=电视台        日期        开始时间        节目名称<nul>2.txt
  10. for /l %%i in (2,1,%num%) do set /p=        时长        日期        开始时间        节目名称<nul>>2.txt
  11. echo.>>2.txt
  12. for /f "skip=1 delims=" %%a in (1.txt) do (
  13.     for %%i in (%%a) do (
  14.         set /a n+=1&if !n! equ 3 set "n=1"
  15.         if !n! equ 2 (
  16.            set /a x+=1
  17.            set /a y=x-1
  18.            set "_!x!=%%i"&call :lp
  19.            ) else (
  20.            set /p=%%i        <nul>>2.txt
  21.     ))
  22.     echo.>>2.txt&set "_!x!="&set "x=0"&set "n=0"
  23. )
  24. start 2.txt&goto :eof
  25. :lp
  26. for /f "tokens=1-2 delims=:" %%i in ("!_%y%!") do set "s1=%%i"&set "m1=%%j"
  27. for /f "tokens=1-2 delims=:" %%i in ("!_%x%!") do set "s2=%%i"&set "m2=%%j"
  28. set /a s=100%s2%%%100-100%s1%%%100,m=100%m2%%%100-100%m1%%%100
  29. set "day=%days:~-2%"
  30. if %m% lss 0 set /a m+=60,s-=1
  31. if %s% lss 0 set /a s+=24,day=100%day%%%100+1
  32. if %day% lss 10 set "day=0%day%"
  33. set /a num=60*s+m
  34. if %x% neq 1 (set /p=%num%        %days:~,-2%%day%        !_%x%!        <nul>>2.txt) else (set /p=%days%        !_%x%!        <nul>>2.txt)
复制代码
ps:"        "不是空格是制表符

[ 本帖最后由 batman 于 2008-7-29 16:57 编辑 ]
***共同提高***

TOP

这是通用版,代码多了很多:
  1. @echo off&color 1f&setlocal enabledelayedexpansion
  2. :begin
  3. set "days=%date:~,-4%"
  4. cls&echo.&echo 请在下面输入初始日期(格式为2008-07-08,默认为当天)
  5. echo.&set /p days=^=^>
  6. if "%days:~4,1%%days:~7,1%" neq "--" echo.&echo 请正确输入&ping /n 2 127.1>nul&goto begin
  7. set /p str=<1.txt
  8. for %%i in (%str%) do if "%%i" equ "开始时间" set /a num+=1
  9. cls&set /p=电视台 日期 开始时间 节目名称<nul>2.txt
  10. for /l %%i in (2,1,%num%) do set /p= 时长 日期 开始时间 节目名称
  11. <nul>>2.txt
  12. echo.>>2.txt
  13. for /f "skip=1 delims=" %%a in (1.txt) do (
  14.     for %%i in (%%a) do (
  15.         set /a n+=1&if !n! equ 3 set "n=1"
  16.         if !n! equ 2 (
  17.            set /a x+=1
  18.            set /a y=x-1
  19.            set "_!x!=%%i"&call :lp
  20.            ) else (
  21.            set /p=%%i <nul>>2.txt
  22.      )
  23.  )
  24.     echo.>>2.txt&set "_!x!="&set "x=0"&set "n=0"
  25. )
  26. start 2.txt&goto :eof
  27. :lp
  28. for /f "tokens=1-2 delims=:" %%i in ("!_%y%!") do set "s1=%%i"&set "m1=%%j"
  29. for /f "tokens=1-2 delims=:" %%i in ("!_%x%!") do set "s2=%%i"&set "m2=%%j"
  30. set /a s=100%s2%%%100-100%s1%%%100,m=100%m2%%%100-100%m1%%%100
  31. set /a year=%days:~,4%,month=100%days:~5,2%%%100,day=100%days:~-2%%%100
  32. if %m% lss 0 set /a m+=60,s-=1
  33. if %s% lss 0 (
  34.    if %x% neq 1 set /a s+=24,day=100%day%%%100+1
  35.    call :judge
  36. )
  37. for %%i in (%month% %day%) do if %%i lss 10 set "%%i=0%%i"
  38. set /a num=60*s+m,v=0
  39. if %x% neq 1 (
  40.    set /p=%num% %year%-%month%-%day% !_%x%! <nul>>2.txt
  41.    ) else (
  42.    set /p=%year%-%month%-%day% !_%x%! <nul>>2.txt
  43. )
  44. goto :eof
  45. :judge
  46. set /a ys1=year%%4,ys2=year%%100,ys3=year%%400
  47. set "py=28"
  48. if %ys2% neq 0 (
  49.  if %ys1% equ 0 set "py=29"
  50.  ) else (
  51.  if %ys3% equ 0 set "py=29"
  52. )
  53. for %%i in (31 %py% 31 30 31 30 31 31 30 31 30 31) do set /a v+=1&set ".!v!=%%i"
  54. if %day% gtr !.%month%! set /a day=1,month+=1
  55. if %month% gtr 12 set /a month=1,year+=1
复制代码


ps:"        "不是空格是制表符

[ 本帖最后由 batman 于 2008-7-29 23:22 编辑 ]
***共同提高***

TOP

  用批处理来做真是勉为其难了,用excel拉动几下就可以了,强烈建议楼主用excel来加工数据。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

返回列表