2

私のファイルでは、すべての行は次のようになります。

\18:49:25 1920/11/29\ 0.25

これを変数に保存したときに、タイプミスがないことをタイムコードが正しいことを確認する方法はありますか (最大 12 か月、4 つの数字で書かれた年など)。

\%H:%M:%S %Y/%m/%d\

ありがとう

PS チェックが毎回機能しないことはわかっています (分と秒を区別することはできませんが、13 か月でないことは確認できます)。

編集: タイムコードは固定されていません。データ ファイルは次のようになります。

    *1920.11.29 18.49.25* 0.25

しかし、それは完全に異なって見えるかもしれません。唯一の確かな考えは、タイムコードを一般的な形式で変数に保存したことです。この場合、それは

*%Y.%m.%d %H.%M.%S*

EDIT2: 私は自分自身を明確に表現していないように見えるので、ここに私が達成したいことの例をいくつか示します:

1)

$ cat input.txt
29/11/1920 17:50
30/11/1920 18:20
01/12/1920 07:20
...

$ ./checktimecode "%d/%m/%Y %H:%M" input.txt

結果=タイムコード OK

2)

$ cat input.txt
**1920/11@17:50**
**1920/12@18:20**
**1920/13@07:20**
...

$ ./checktimecode "**%Y/%d@%H:%M**" input.txt

結果=タイムコード OK

$ ./checktimecode "**%Y/%m@%H:%M**" input.txt

結果 = BAD タイムコード

3)

$ cat input.txt
!17/50/20\29/11/1920&
!18/20/50\30/11/1920&
!07/18/05\01/12/1920&
...

$ ./checktimecode "!%H/%M/%S\%d/%m/%Y&" input.txt

結果=タイムコード OK

$ ./checktimecode "%H/%M/%S\%d/%m/%Y&" input.txt

結果 = BAD タイムコード

4

4 に答える 4

1

Python のtime.strptime()またはを使用しdatetime.strptime()ます。

#!/usr/bin/python2.6
from datetime import datetime
import sys
format = sys.argv[1]
file = sys.argv[2]

with open(file, 'r') as f:
    for line in f:
        try:
            datetime.strptime(line.rstrip(), format)
        except:
            print "BAD timecode"
            sys.exit(1)

print "timecode OK"

編集:

使用法:

$ ./checktimecode "%d/%m/%Y %H:%M" input.txt
于 2012-04-08T16:56:19.103 に答える
1

サンプル日付:

$ cat input.txt

\18:00:00 1920/11/29\ OK
\18:00:00 1920/13/29\ KO
\00:61:00 1920/02/29\ KO
\25:00:00 1920/11/29\ KO
\00:00:00 1920/11/29\ OK

awk脚本

#!/usr/bin/awk -f

BEGIN{
    FS = "\\"
}

!check_date_time($2)

function check_date_time(dt,     a,date,time,year,mon,day,hour,min,sec)
{
    split(dt, a, " ")
    date = a[2]
    time = a[1]

    split(date, a, "/")
    year = a[1]
    mon  = a[2]
    day  = a[3]

    split(time, a, ":")
    hour = a[1]
    min  = a[2]
    sec  = a[3]

    return check_date(year, mon, day) && check_time(hour, min, sec)
}

function check_time(hour, min, sec)
{
    return 0<=hour && hour<=23 && 0<=min && min<=59 && 0<=sec && sec<=59
}

function check_date(year, mon, day)
{
    if (mon < 0 || mon >= 13)
        return 0
    else if (day == 31 && (mon == 4 ||  mon == 6 || mon == 9 || mon == 11))
        return 0;
    else if (day >= 30 && mon == 2)
        return 0;
    else if (mon == 2 && day == 29 && ! (  year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)))
        return 0;
    else
        return 1;
}

出力

$ awk -f chk_date_time.awk input.txt

\18:00:00 1920/13/29\ KO
\00:61:00 1920/02/29\ KO
\25:00:00 1920/11/29\ KO
于 2012-04-07T01:53:14.577 に答える
0

H、M、S、Y、m、および d を任意のルールに検証できます...

awk -F'[\\\\:/ ]' '{H=$2; M=$3; S=$4; Y=$5; m=$6; d=$7; print "=" H "=" M "=" S "=" Y "=" m "=" d "="}'
于 2012-04-06T23:48:22.823 に答える
0

TXR:

@(do (defvar counter (range 1)))
@(collect :vars ())
@  (bind lineno @(pop counter))
@;;; 
@;;; Here we can add numerous cases for different date formats.
@;;;
@  (try)
@    (cases)
\@hh:@mm:@ss @year/@mo/@da\ @stuff
@    (or)
*@year.@mo.@da @hh.@mm.@ss* @stuff
@    (or)
@line
@    (throw error `line @lineno: unrecognized format`)
@    (end)
@    (filter :tonumber hh mm ss year mo da)
@    (do
       (each ((n (list hh mm ss year mo da)))
         (if (null n)
           (throw 'error `line @lineno: bad number`))
         (if (< n 0)
           (throw 'error `line @lineno: negative number`)))
       (if (> hh 23)
         (throw 'error `line @lineno: hour > 23`))
       (if (> mo 12)
         (throw 'error `line @lineno: month > 13`)))
@  (catch error (err))
@    (do (format t "~a\n" err))
@  (end)
@(end)

データ:

\28:49:25 1920/11/29\ 0.25
*1920.13.29 18.49.25* 0.25
asdf *1920.28
*-1920.11.29 18.49.25* 0.25
*1920.x3.29 18.49.25* 0.25

走る:

$ txr times.txr  times.txt  | sed -e 's/^/    /'
line 1: hour > 23
line 2: month > 13
line 3: unrecognized format
line 4: negative number
line 5: bad number

肩をすくめる。おそらく、この例外アプローチは、エントリごとに最大 1 つのエラー レポートしか得られないため、あまり良い考えではありません。ただし、誤ったエントリが比較的まれな場合は、おそらく問題ありません。

于 2012-04-07T02:11:02.147 に答える