- 締切済み
CSVデータを用いた日数計算
perlにてcsvファイルの値(日時)を抜き出して計算したいと思っています。 csvの内容は以下のようになっています。 user1,2022/2/28 21:02,2022/2/28 22:37 user2,2022/2/28 23:55,2022/2/29 23:55 user3,2022/2/28 23:51,2022/3/1 0:19 ユーザー名、ジョブ開始日時、ジョブ終了日時という順番で値が並んでいます。 この中で特定ユーザーのジョブ実行時間を抜き出し、計算させたいと考えています。 「ジョブ終了日」から「ジョブ開始日」を引いて、実行時間を出力するには、 どのような記述が必要でしょうか? どうか、よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- asciiz
- ベストアンサー率70% (6803/9674)
生のPerlでは、日付文字列は文字列として扱うしかなく、自分で文字列を解析して日付・時刻を計算する、と言うことをしなければなりません。 しかしそれは面倒だしバグも入ったりするので、古くはDateTimeモジュールが作成され、Perl 5.10以降は Time::Piece モジュールが標準で入っているようです。 >Perlで日付・時刻を扱う - Perlゼミ|Perlの基礎をインストールからサンプルで丁寧に解説 >https://perlzemi.com/blog/20161123147990.html Time::Piece の方で少し組んでみました。 ---- difftime.pl ---- use strict; use Time::Piece; my ($user, $beginstr, $endstr); while(<>){ chomp; ($user, $beginstr, $endstr) = split(/,/); my $begintime = Time::Piece->strptime($beginstr, '%Y/%m/%d %H:%M:%S'); my $endtime = Time::Piece->strptime($endstr, '%Y/%m/%d %H:%M:%S'); my $difftime = $endtime - $begintime; print "User: $user, Diff: $difftime sec.\n"; } ---- ここまで---- ---- data.csv ---- user1,2022/2/28 21:02,2022/2/28 22:37 user2,2022/2/28 23:55,2022/2/29 23:55 user3,2022/2/28 23:51,2022/3/1 0:19 ---- ここまで ---- これを、perl difftime.pl data.csv として実行すると、 ---- 出力ここから ---- User: user1, Diff: 5700 sec. User: user2, Diff: 86400 sec. User: user3, Diff: 1680 sec. ---- ここまで ---- という出力が得られます。 日付オブジェクト同士の引き算は、秒数として計算されるわけです。 秒数が計算出来れば、時間単位にするには60×60=3600で割ればいいし、日付単位なら24×60×60=86400で割ればいいし、ということで自由に加工してください。 指定ユーザーだけ取り出したければif文で $user を判定してください。
セル全体の列を選択 データ区切り位置 - コンマやタブなどの・・・ 次へ(H) 区切り文字を適当にチェックマーク付ける 完了(F)