2013-05-10 51 views
1

我對有趣的問題,我需要對項目進行排序在文本文件中日期的列表,它看起來像這樣:排序按日期與Windows批處理腳本的文本文件

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天是按日期排列的。

+0

你應該考慮使用[PowerShell的(http://en.wikipedia.org/wiki/Windows_PowerShell)。 – mbeckish 2013-05-10 13:49:14

+0

如果我使用powershell腳本,我可以從我的批處理腳本調用它,這樣就不會有問題,我想。你有從PowerShell的示例代碼? – 2013-05-10 13:51:59

+0

不,對不起,我沒有。但谷歌有很多很多的樣本。 – mbeckish 2013-05-10 13:53:31

回答

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(因此12 AM-> 10在1AM-> 11之前排序)

對YEAR + MONTH + DAY + AMPM + HOUR + MIN +,+ HTTP ... +,+數據的結果進行排序,並輸出第一個令牌(用逗號分隔)

+0

嘿,你可以看看我的代碼,並告訴我如何強制格式化是2001年1月1日反對1/1/2001,我會投票給你。 (因爲它主要用於... – 2013-05-16 19:32:18

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 

編輯:添加代碼改進關於彼得·懷特的評論

JDN

+0

你是一個生活節省!我今晚要試試這個! – 2013-05-10 14:53:22

+0

我不確定你的日期格式,請提供此信息(月份或日期是否有前導零)?請顯示'echo%date%'的輸出。我現在按以下格式調整日期:'Fr 05/10/2013'。請讓我知道,如果你的不同。 – Endoro 2013-05-10 15:06:33

+1

哦 - 非常聰明,使用變量名進行排序。遺憾的是,如果任何日期的記錄不止一個,它將不起作用 - 您需要擴展名稱以包括HH和MM,並對AM/PM進行一些調整。另一個改進是,只要日期有限,你所需要做的就是制定(今天爲100),並跳過輸出目標日期名稱小於$ ...的任何$ ...。 – Magoo 2013-05-10 15:33:53

0

如果您正在排序的數據已經是文本形式我認爲您可以複製並粘貼到新的Excel文檔並按日期排序

0

我的代碼在這一刻,謝謝你們的幫助到目前爲止!我還需要它來改變日期格式YYYYMMDD,一些錯誤的代碼..哎呀

@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 
+0

我已經添加了所需的更正,基本上,你沒有設置RMONTH,RDAY和RHOUR,所以這些輸出都是[無],我也' REM''把你的調試行寫出來,'datetojdn'例程需要YYYYMMDD格式,所以在月份和日期數字中加100,然後使用最後2個字符應該產生所需的結果(或者像我一樣,從位置開始的字符串1,它簡單地刪除了3個字符中的第一個) – Magoo 2013-05-17 05:27:39

+0

我花了幾個小時試圖理解!var!和%% var和%var%...非常感謝你的幫助,我沒有知道我會在沒有你的情況下做到這一點。 – 2013-05-18 00:27:36