Board logo

标题: [文本处理] [求助]利用批处理计算时间差及代码修正 [打印本页]

作者: 奇然无双    时间: 2008-7-28 09:21     标题: [求助]利用批处理计算时间差及代码修正

  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 09:50

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

[ 本帖最后由 batman 于 2008-7-28 10:03 编辑 ]
作者: namejm    时间: 2008-7-28 10:12

  想问一下楼主,每行有多少列?是固定列数吗?是不是只统计当天及下一天的?当天的是从几点开始——如果不知道当天从几点开始的话,那么,就难以区分0点是当天的还是下一天的。
作者: 奇然无双    时间: 2008-7-28 10:32

后面的时间肯定比前面的时间要大
如果是先0:00 再1:00,那么1:00-0:00=60
如果是先1:00再0:00,那么0:00-1:00=1380
作者: namejm    时间: 2008-7-28 10:41

  楼主还是一次性把我在2楼的问题都回答完吧,我好写代码。
作者: 奇然无双    时间: 2008-7-28 13:19

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


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

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

[ 本帖最后由 奇然无双 于 2008-7-28 13:24 编辑 ]
作者: namejm    时间: 2008-7-28 16:34

  对了,那个节目类型的数据是怎么来的?说说规律吧。
作者: 奇然无双    时间: 2008-7-29 09:03

原帖由 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        其他

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

没有概念,说的很乱,希望哥们儿能够理解我说的话
作者: batman    时间: 2008-7-29 10:50

本来我都快写好了,现在一看还是不合楼主要求啊
作者: namejm    时间: 2008-7-29 11:06

  如果某个台的某个节目是固定的类型的话,完全可以做一张类型表出来,自动汇总到总表中去。
作者: 奇然无双    时间: 2008-7-29 13:57

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

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


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

应该是这样的,如果我曾经划分过某台的某个节目,就应该固定这个节目的类型了。
作者: 奇然无双    时间: 2008-7-29 15:08

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

没有计算合理日期:
  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 编辑 ]
作者: batman    时间: 2008-7-29 23:01

这是通用版,代码多了很多:
  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 编辑 ]
作者: namejm    时间: 2008-7-29 23:30

  用批处理来做真是勉为其难了,用excel拉动几下就可以了,强烈建议楼主用excel来加工数据。
作者: 奇然无双    时间: 2008-7-30 09:31

原帖由 namejm 于 2008-7-29 23:30 发表
  用批处理来做真是勉为其难了,用excel拉动几下就可以了,强烈建议楼主用excel来加工数据。


我知道批处理做这事很困难。。。SORRY我给大家添麻烦了。。。
版版写的第一个代码在测试时碰到特殊符号就报错“: , ( )”,我给一份供测试的文件来吧,见1.txt
http://badmars.go3.icpcn.com/1.txt
辛苦各位了,十分抱歉。。。

[ 本帖最后由 batman 于 2008-7-30 10:19 编辑 ]
作者: batman    时间: 2008-7-30 10:19

楼主测试了我后面写的代码不啊?
作者: 奇然无双    时间: 2008-7-30 15:48

原帖由 batman 于 2008-7-30 10:19 发表
楼主测试了我后面写的代码不啊?

1号代码测试不成功,节目名称有特殊符号时会出错
2号代码我不知道哪里要把“ ”替换成制表符。。。

我邮箱[email=qivsran@163.com]qivsran@163.com[/email]
不如发我的邮箱吧
上面我发的1.txt就是节目单的目标文件,FTP是我自己的,你可以下载那个TXT文件测试一下看
辛苦了。。。
作者: batman    时间: 2008-7-30 18:02

2号代码测试测试结果如下:
1.txt
  1. 电视台 开始时间 节目名称 开始时间 节目名称 开始时间 节目名称
  2. 电视台一 22:44 节:目一 22:50 节,目二 0:20 节目三
  3. 电视台二 22:00 节目一 23:35 节(目二) 1:35 节;目三
复制代码
2.txt
  1. 电视台        日期        开始时间        节目名称        时长        日期        开始时间        节目名称        时长        日期        开始时间        节目名称
  2. 电视台一        2008-7-30        22:44        节:目一        6        2008-7-30        22:50        节,目二        90        2008-7-31        0:20        节目三        
  3. 电视台二        2008-7-30        22:00        节目一        95        2008-7-30        23:35        节(目二)        120        2008-7-31        1:35        节;目三      
复制代码
excel

ps:已发至楼主邮箱,真的晕了!




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