1

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

    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

4 回答 4

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 评论的代码改进

京东

于 2013-05-10T14:47:21.530 回答
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->10)将每个元素转换为恒定长度字段在凌晨 1 点-> 11 点之前排序)

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

于 2013-05-10T15:07:52.757 回答
0

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

于 2013-05-10T15:36:10.733 回答
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
于 2013-05-14T23:50:29.007 回答