[Short Prog] ウィークナンバーゲッター
毎週のドキュメントをディレクトリに、または毎週のタスクをスプレッドシートに保存する 1 つの方法は、それらを毎週別のディレクトリ (またはシート) に保存することです.また、(08.02-08.08) などのピリオド表記よりも名前が短いため、週番号を使用しました.
請求書をスキャンして、「20210805.Chicken.pdf」のような名前を付けてから、適切な「週番号」ディレクトリに移動しました.
次に、一致する毎週のディレクトリにそれらを自動的に配置する方法があることに気付きました.
私は raku ユーザーです.以下のような単純な端末インターフェースプログラムにすることができます.
いくつかの構文に慣れれば、かなり簡単だと思います.
「20210804」のような単一のテキストを使用する場合
MAIN() にもう 1 つのマルチサブを追加できます.
インターネットを検索し、DateTime モジュールを使用して実装しました.
しかし、DateTime はかなり重いモジュールだと思います.通常、perl は非常に高速ですが、このプログラムはそうではありません.
私はまだコードの一部が嫌いで、エラーを処理する適切な方法はありませんが、高速に動作しています.ということで、しばらくこの番組を続けます.
だから今、いくつかのスクリプトがファイルを通過するようにする必要があります
ファイル名から日付情報を取得し、それらを移動します
適切な場所.
わかった.今日は以上です.
請求書をスキャンして、「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
だから今、いくつかのスクリプトがファイルを通過するようにする必要があります
ファイル名から日付情報を取得し、それらを移動します
適切な場所.
わかった.今日は以上です.
Reference
この問題について([Short Prog] ウィークナンバーゲッター), 我々は、より多くの情報をここで見つけました https://dev.to/jeongoon/short-prog-week-number-getter-49m2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol