使用Windows批处理脚本按日期对文本文件进行排序

时间:2013-05-10 13:46:02

标签: batch-file

我有一个有趣的问题,我需要在一个文本文件中按日期排序项目列表,如下所示:

    http://www.boatus.com/sailing,1/21/2013 9:00 PM
    http://www.boatus.com/powerboat,3/21/2012 10:00 PM
    http://www.boatus.com/games.html,5/20/2013 10:00 PM
    http://www.boatus.com/,4/11/2013 10:00 PM
    http://www.boatus.com/pressroom/prrss.asp,4/21/2013 10:00 PM
    http://www.boatus.com/,4/20/2013 9:00 PM

我也只需要说100天的历史。因此,如果今天是2013年5月10日,我只想要从2013年1月30日 - 2013年5月10日。因此,排序后上面的列表应如下所示:

    http://www.boatus.com/,4/11/2013 10:00 PM
    http://www.boatus.com/,4/20/2013 9:00 PM
    http://www.boatus.com/pressroom/prrss.asp,4/21/2013 10:00 PM
    http://www.boatus.com/games.html,5/20/2013 10:00 PM

因此,按日期排序仅过去100天。

4 个答案:

答案 0 :(得分:2)

试试这个(列表在file.txt中):

@echo off &setlocal
for /f "tokens=1*delims=[] " %%x in ('^<file.txt find /n /v ""') do (
    for /f "tokens=2delims=, " %%j in ("%%y") do (
        for /f "tokens=1-3delims=/" %%a in ("%%j") do (
            if %%a lss 10 if %%b lss 10 set "$%%c0%%a0%%b%%x=%%y"
            if %%a lss 10 if %%b geq 10 set "$%%c0%%a%%b%%x=%%y"
            if %%a geq 10 if %%b lss 10 set "$%%c%%a0%%b%%x=%%y"
        )
    )   
)
for /f "tokens=1-4delims=/ " %%i in ("%date%") do set /a month=1%%j-100, day=1%%k-100, year=%%l
if %month% lss 10 set "month=0%month%"
if %day% lss 10 set "day=0%day%"
call:DateToJDN %year%%month%%day% today
setlocal enabledelayedexpansion
for /f "tokens=1*delims=$=" %%i in ('set "$"') do (
    if defined today (
        call:DateToJDN %%i uday
        set /a diffdays=today-uday
        if !diffdays! leq 100 set "today="&echo(%%j
    ) else echo(%%j
)
endlocal
goto:eof

:DateToJDN yyyymmdd jdn=
setlocal
set date=%1
set /A yy=%date:~0,4%, mm=1%date:~4,2% %% 100, dd=1%date:~6,2% %% 100
set /A a=mm-14, jdn=(1461*(yy+4800+a/12))/4+(367*(mm-2-12*(a/12)))/12-(3*((yy+4900+a/12)/100))/4+dd-32075
endlocal & set %2=%jdn%
exit /B

编辑:添加了有关Peter Wright评论的代码改进

JDN

答案 1 :(得分:1)

这是我的版本,因为我写了它 - 我不打扰“过去100天”的部分,如果你改变主意,那就很容易了。

@ECHO OFF
SETLOCAL enabledelayedexpansion
(
FOR /f "tokens=1*delims=, " %%h IN (swydf.txt) DO (
 FOR /f "tokens=1-7delims=/: " %%a IN ("%%i") DO (
  SET /a rmonth=10+%%a
  SET /a rday=10+%%b
  SET /a rhour=10+%%d
  IF %%d==12 (SET rhour=10)
  ECHO %%c!rmonth!!rday!%%f!rhour!%%e,%%h,%%i
 )
)
)>sorttemp.txt
(
FOR /f "tokens=1*delims=," %%i IN ('sort ^<sorttemp.txt') DO ECHO %%j
)>output.txt
TYPE output.txt
DEL sorttemp.txt /F /Q
GOTO :eof

基本上,日期和时间元素通过添加10来转换为恒定长度字段(因为所有条形分钟是1..31 - 制作11..41)然后将小时设置为10(如果它是12(因此12AM) - &gt;在上午1点前进行10次排序 - &gt; 11)

对YEAR + MONTH + DAY + AMPM + HOUR + MIN +,+ HTTP ... +,+数据的结果进行排序,并输出第一个标记后的余数(以逗号分隔)

答案 2 :(得分:0)

如果您要排序的数据已经是文本格式,我认为您可以复制并粘贴到新的Excel文档并按日期排序

答案 3 :(得分:0)

目前我的代码,谢谢你们的帮助到目前为止!!!!我仍然需要它将日期格式更改为YYYYMMDD,代码有问题.. grrr

    @ECHO OFF
    SETLOCAL enabledelayedexpansion

    for /f "tokens=1-3delims=/" %%i in ("%date:~4,10%") do set /a month=%%i, day=%%j, year=%%k
    if %month% lss 10 set "month=0%month%"
    if %day% lss 10 set "day=0%day%"
    call:DateToJDN %year%%month%%day% today
    echo Today %today% %year%%month%%day% 

    (
    FOR /f "tokens=1*delims=, " %%h IN (file.txt) DO (
     FOR /f "tokens=1-7delims=/: " %%a IN ("%%i") DO (

      SET /A RMONTH=100+%%a, RDAY=100+%%b
      SET /a RHOUR=%%d+100
      IF %%d==12 SET RHOUR=100
      call:DateToJDN %%c!RMONTH:~1!!RDAY:~1! rtoday
      REM call:DateToJDN %%c%%a%%b rtoday
      set /a diffdays=!today!-!rtoday!
      REM echo diffdays ===  !today!-!rtoday! = !diffdays!
      if !diffdays! leq 100 (
        ECHO %%c!rmonth!!rday!%%f!rhour!%%e,%%h,%%i
      )
     )
    )
    )>sorttemp.txt
    (
    FOR /f "tokens=1*delims=," %%i IN ('sort ^<sorttemp.txt') DO ECHO %%j
    )>output.txt
    TYPE output.txt
    ::: DEL sorttemp.txt /F /Q
    notepad sorttemp.txt
    GOTO :eof

    :DateToJDN yyyymmdd jdn=
    setlocal
    set date=%1
    REM echo %date%
    set /A yy=%date:~0,4%, mm=1%date:~4,2% %% 100, dd=1%date:~-2% %% 100
    set /A a=mm-14, jdn=(1461*(yy+4800+a/12))/4+(367*(mm-2-12*(a/12)))/12-(3*((yy+4900+a/12)/100))/4+dd-32075
    endlocal & set %2=%jdn%
    exit /B

    endlocal