[Short Prog] ウィークナンバーゲッター


毎週のドキュメントをディレクトリに、または毎週のタスクをスプレッドシートに保存する 1 つの方法は、それらを毎週別のディレクトリ (またはシート) に保存することです.また、(08.02-08.08) などのピリオド表記よりも名前が短いため、週番号を使用しました.
請求書をスキャンして、「20210805.Chicken.pdf」のような名前を付けてから、適切な「週番号」ディレクトリに移動しました.
次に、一致する毎週のディレクトリにそれらを自動的に配置する方法があることに気付きました.

楽で週番号を取得する方法



私は raku ユーザーです.以下のような単純な端末インターフェースプログラムにすることができます.

#!/usr/bin/env raku
multi sub MAIN ( Int $year, Int $month, Int $day ) {
    say Date.new( :$year, :$month, :$day ).week-number();
}



> chmod u+x week-number.raku
> week-number.raku 2021 8 4
31


いくつかの構文に慣れれば、かなり簡単だと思います.

「20210804」のような単一のテキストを使用する場合
MAIN() にもう 1 つのマルチサブを追加できます.

sub cut-off-last-two-digits( @i ) returns Int {
    # warning: side effect
    ( @i.pop, @i.pop ).reverse.join.Int
}

multi sub MAIN ( Int \yyyymmdd ) {
    my @i = yyyymmdd.comb;

    my ( $year, $month, $day );

    $day   = cut-off-last-two-digits @i;
    $month = cut-off-last-two-digits @i;
    $year  = @i.join.Int;

    if (( $year, $month, $day )>>.defined).any == False {
        die "check your input: {yyyymmdd}";
    }
    samewith( $year, $month, $day );
}

multi sub MAIN ( Int $year, Int $month, Int $day ) {
    say Date.new( :$year, :$month, :$day ).week-number();
}


Perl5 バージョン



インターネットを検索し、DateTime モジュールを使用して実装しました.
しかし、DateTime はかなり重いモジュールだと思います.通常、perl は非常に高速ですが、このプログラムはそうではありません.

#!/usr/bin/env perl
use strict; use warnings;
use v5.26;
use DateTime;
use File::Basename;

our $PROG = $0;

my @parsed;
my ( $year, $month, $day );

use enum qw(F_YEAR F_MONTH F_DAY);

sub usage {
    print <<  'END_OF_USAGE';
$PROG <YYYYMMDD>
  OR
$PROG <YYYY> <MM> <DD>
END_OF_USAGE
}

if ( @ARGV == 1 ) {
    # parse as YYYYMMDD
    my $str = $ARGV[0];
    @parsed = $str =~ /^(\d+)(\d\d)(\d\d)$/;
} elsif ( @ARGV == 3 ) {
    @parsed = @ARGV;
} else {
    usage();
    exit 1;
}

( $year, $month, $day ) = @parsed[F_YEAR, F_MONTH, F_DAY];

my $dt = DateTime->new( year     => $year,
                       month    => $month,
                       day      => $day );

print $dt->week_number();


Haskell バージョン



私はまだコードの一部が嫌いで、エラーを処理する適切な方法はありませんが、高速に動作しています.ということで、しばらくこの番組を続けます.

> stack new week-number


app/Main.hs




module Main where

import System.Environment
import Lib

main :: IO ()
main = do
  args <- getArgs -- note: args :: [String]
  putStrLn (case args of
              yyyymmdd:[] ->
                weekNumberStringFromString yyyymmdd
              y:m:d:[] ->
                let y' = (read y :: Integer)
                    m' = (read m :: Int)
                    d' = (read d :: Int)
                in
                  weekNumberStringFromGregorian y' m' d'
              _ ->
                unlines
                [ "usage:"
                , "week-number: <yyyymmdd>"
                , "  or"
                , "week-number: <yyyy> <m> <d>" ] )


src/Lib.hs




module Lib
  ( weekNumberStringFromString
  , weekNumberStringFromGregorian
    ) where

import qualified Data.Time as DT

weekNumberStringFromString :: String -> String
weekNumberStringFromString yyyymmdd =
  let ut = DT.parseTimeOrError
           True DT.defaultTimeLocale "%Y%m%d" yyyymmdd  :: DT.UTCTime
  in
    DT.formatTime DT.defaultTimeLocale "%V" ut

weekNumberStringFromGregorian :: Integer -> Int -> Int -> String
weekNumberStringFromGregorian y m d =
  ( DT.formatTime DT.defaultTimeLocale "%V" ) $ DT.fromGregorian y m d



> stack build
> stack install
> week-number-exe 2021 8 4
31


だから今、いくつかのスクリプトがファイルを通過するようにする必要があります
ファイル名から日付情報を取得し、それらを移動します
適切な場所.

わかった.今日は以上です.