标题: [文本处理] 批处理如何在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楼 的帖子
- @echo off
- 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
- echo.!str!
- )
- )
- ))>b.txt
- echo 输入筛选日期范围(1-31):
- set /p BeginDate=开始日期:
- set /p EndDate=结束日期:
- (for /l %%a in (%BeginDate%,1,%EndDate%) do (
- if %BeginDate% lss 10 (
- findstr "%date:~,4%%date:~5,2%0%%a" b.txt
- ) else (
- findstr "%date:~,4%%date:~5,2%%%a" b.txt
- )
- ))>yes.txt
- 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- '&cls&cscript -nologo -e:vbscript "%~f0"<"文本.txt"&pause&exit
- Set fso=CreateObject("Scripting.FileSystemObject")
- Set objDict = WSH.CreateObject("Scripting.Dictionary")
- y = year(Now)
- m = month(Now)
- d = DateAdd("d", -1, DateValue(y&"-"&m&"-1"))
- Do Until CLng(ym) > CLng(y&right("0"&m, 2))
- d = DateAdd("d", 1, d)
- ym = year(d)&right("0"&month(d), 2)
- '1星期日 2星期一 3星期二 4星期三 5星期四 6星期五 7星期六
- If CLng(ym) = CLng(y&right("0"&m, 2)) and Weekday(d) <> 1 Then
- str = str & ym & right("0"&day(d), 2) & Chr(32)
- End If
- Loop
- n = split("15,16", ",") '提取15、16日
- For i=0 To UBound(n)
- objDict.Add CInt(n(i)), 1
- Next
- str = split(RTrim(str), Chr(32))
- Do While WSH.StdIn.AtEndOfStream <> true
- line = WSH.StdIn.ReadLine
- For i=0 To UBound(str)
- If objDict.Exists(CInt(1&right(str(i), 2))-100) Then
- s1 = s1 & str(i) & line & vbCrLf
- Else
- s2 = s2 & str(i) & line & vbCrLf
- End If
- 's3 = s3 & str(i) & line & vbCrLf
- Next
- Loop
- WSH.echo s1
- 'fso.OpenTextFile("提取.txt", 2, true).Write s1
- 'fso.OpenTextFile("其余.txt", 2, true).Write s2
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |