Board logo

标题: [文本处理] 批处理如何在txt文本每一行的行首/开头添加当月/本月除星期日外的日期 [打印本页]

作者: heyoug    时间: 2009-3-12 20:52     标题: 批处理如何在txt文本每一行的行首/开头添加当月/本月除星期日外的日期

本帖最后由 pcl_test 于 2016-7-8 17:00 编辑

a.txt中的数据如下:
1234567
2345678
读取a.txt中的数据,并在数据前面加上本月的日期,(星期天除外)。
处理后的数据:
200903021234567
200903022345678
......
200903311234567
200903312345678
然后输入筛选日期范围:15,16
符合条件的:
200903151234567
200903152345678
200903161234567
200903162345678
输出到B.TXT
其他数据输出到C.txt

请问这个批处理应该怎么实现!

[ 本帖最后由 heyoug 于 2009-3-12 20:54 编辑 ]
作者: Batcher    时间: 2009-3-12 20:58

开始
运行
cmd
echo %date% %time%
结果贴出来看看

另,从你的数据中看不出什么规律,能否多举几个例子来说明日期是按照什么规律加上去的?
作者: heyoug    时间: 2009-3-12 21:03

20090302                   1234567
20090302                   2345678
......
20090331                  1234567
20090331                  2345678
前面表示本月的日期  后面的是a.txt中的数据  2者组合而成,这里表示从20090302一直到20090331组合a.txt里面的数据而形成的新数据。
作者: namejm    时间: 2009-3-12 21:21

  若要写一个通用的代码,有两个难题需要解决:

  1、平年闰年的判断;
  2、日期与星期的换算;

  在批处理中,这两个问题处理起来是相当的麻烦。若不是跨年的计算,则难度大为降低。还请楼主说明一下要处理的年代范围,方好写代码。

  另外,本机上的日期格式也影响到具体代码的编写,这也是batcher在2楼中要你贴出 echo %date% %time% 结果的原因。
作者: heyoug    时间: 2009-3-12 21:29

for /f "tokens=1-3 delims=-/\:. " %%i in ("%date%") do set /a y=%%i,m=100%%j%%100
    set/a PN2="!(y%%4)&!(!(y%%100))|!(y%%400)",PN2=28+PN2
    for /f "tokens=%m%" %%i in ("31 %pN2% 31 30 31 30 31 31 30 31 30 31") do set d=%%i
    if %m% leq 2 set/a y-=1,m+=12
    setlocal enabledelayedexpansion
    for /l %%i in (1 1 %d%) do (
    set/a t=^(%%i+2*m+3*^(m+1^)/5+y+y/4-y/100+y/400+1^)%%7
    if %%i lss 10 (set n=0%%i)else set n=%%i
    if !t! neq 0 (
    for /f "delims=" %%j in (a.txt) do (
    set str=%%j
    call set str=%%str:!str:~,3!=%date:~,4%%date:~5,2%!n!%%001
    >>b.txt echo !str!
)))
这是某一位高手以前发给我的代码,上面能实现润月以及星期天的判断,现在想能设置个塞选范围,把符合条件的输出到b.txt  不符合条件的输出到c.txt,谢谢指点!
作者: heyoug    时间: 2009-3-13 09:36

请高手指点一下!在线急等!
作者: Batcher    时间: 2009-3-13 21:10     标题: 回复 5楼 的帖子

  1. @echo off
  2. for /f "tokens=1-3 delims=-/\:. " %%i in ("%date%") do set /a y=%%i,m=100%%j%%100
  3. set/a PN2="!(y%%4)&!(!(y%%100))|!(y%%400)",PN2=28+PN2
  4. for /f "tokens=%m%" %%i in ("31 %pN2% 31 30 31 30 31 31 30 31 30 31") do set d=%%i
  5. if %m% leq 2 set/a y-=1,m+=12
  6. setlocal enabledelayedexpansion
  7. (for /l %%i in (1 1 %d%) do (
  8.   set/a t=^(%%i+2*m+3*^(m+1^)/5+y+y/4-y/100+y/400+1^)%%7
  9.   if %%i lss 10 (set n=0%%i)else set n=%%i
  10.   if !t! neq 0 (
  11.     for /f "delims=" %%j in (a.txt) do (
  12.       set str=%%j
  13.       call set str=%%str:!str:~,3!=%date:~,4%%date:~5,2%!n!%%001
  14.       echo.!str!
  15.     )
  16.   )
  17. ))>b.txt
  18. echo 输入筛选日期范围(1-31):
  19. set /p BeginDate=开始日期:
  20. set /p EndDate=结束日期:
  21. (for /l %%a in (%BeginDate%,1,%EndDate%) do (
  22.   if %BeginDate% lss 10 (
  23.     findstr "%date:~,4%%date:~5,2%0%%a" b.txt
  24.   ) else (
  25.     findstr "%date:~,4%%date:~5,2%%%a" b.txt
  26.   )
  27. ))>yes.txt
  28. findstr /v /g:yes.txt b.txt>no.txt
复制代码

作者: pcl_test    时间: 2016-7-8 18:11

本帖最后由 pcl_test 于 2016-7-9 01:46 编辑

bat+vbs
  1. '&cls&cscript -nologo -e:vbscript "%~f0"<"文本.txt"&pause&exit
  2. Set fso=CreateObject("Scripting.FileSystemObject")
  3. Set objDict = WSH.CreateObject("Scripting.Dictionary")
  4. y = year(Now)
  5. m = month(Now)
  6. d = DateAdd("d", -1, DateValue(y&"-"&m&"-1"))
  7. Do Until CLng(ym) > CLng(y&right("0"&m, 2))
  8.     d = DateAdd("d", 1, d)
  9.     ym = year(d)&right("0"&month(d), 2)
  10.     '1星期日 2星期一 3星期二 4星期三 5星期四 6星期五 7星期六
  11.     If CLng(ym) = CLng(y&right("0"&m, 2)) and Weekday(d) <> 1 Then
  12.         str = str & ym & right("0"&day(d), 2) & Chr(32)
  13.     End If
  14. Loop
  15. n = split("15,16", ",")  '提取15、16日
  16. For i=0 To UBound(n)
  17.     objDict.Add CInt(n(i)), 1
  18. Next
  19. str = split(RTrim(str), Chr(32))
  20. Do While WSH.StdIn.AtEndOfStream <> true
  21.     line = WSH.StdIn.ReadLine
  22.     For i=0 To UBound(str)
  23.         If objDict.Exists(CInt(1&right(str(i), 2))-100) Then
  24.             s1 = s1 & str(i) & line & vbCrLf
  25.         Else
  26.             s2 = s2 & str(i) & line & vbCrLf
  27.         End If
  28.     's3 = s3 & str(i) & line & vbCrLf
  29.     Next
  30. Loop
  31. WSH.echo s1
  32. 'fso.OpenTextFile("提取.txt", 2, true).Write s1
  33. 'fso.OpenTextFile("其余.txt", 2, true).Write s2
复制代码





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