search
LoginSignup
0
Help us understand the problem. What are the problem?

posted at

updated at

4分チャレンジ:31時(翌7時)基準のファイル分割ツール

はじめに

前記事

  1. 4分チャレンジ:タブ区切りファイルをhtmlファイルに変換する

毎日手作業で実施しているような小さなタスクをツール化する。
要件の洗い出しと、実装は分ける。

要件

通常、ログファイル等の分割は、日付単位でyyyymmdd等のファイル名に保存する。
ログファイルも当然溜まっていくが、チャートデータChartData.csvは1日単位で必要で、翌日には4本値をダウンロードすれば良いので、Tick単位のファイル(約1MB)はアーカイブしたい。
ただし、ザラ場が8:45-15:15、16:30-30:00のため、23:59:59で分割する意味がなく、翌日の06:00:01が最後のデータの後を基準にする。

過去のログファイルを確認すると、06:06ごろに注文stateが1に変更、06:17にAPI強制ログアウト、再ログイン後に終了した注文が削除、07:51ごろにcurPrice=0、08:00以降から注文stateが3に変更される。

以上を踏まえて、07:00:00を日付変更線として、5/13分のデータは、5/13 07:00:00.000~5/14 06:59:59.999として、5/14 07:00:00以降にアーカイブ対象にする。

  • ファイルのエンコーディングはUTF-8前提
  • 基本的には毎日7:10ごろに実行するが、2日以上溜まっている場合も一度に処理する
  • ファイルの各行がyyyy/MM/dd HH: mm:ssまたはyyyy/MM/dd HH: mm:ss.SSSで始まる前提とする
  • ファイルの各行に日時が存在しない場合は、ファイル全体を処理対象とせずにスキップする
  • 起動パラメータにファイルパスを渡し、アーカイブファイル名はオリジナルのファイル名ChartData.csvに7:00時点の日付をつけてChartData_yyyymmdd.csvにする
  • アーカイブファイルはサブディレクトリarchiveに保存する
  • アーカイブファイルが存在する場合は、マージ後のソートをせずに、そのまま追記する

追記:0時基準のファイル分割ツール

まず0時基準のファイル分割ツールを作成する。
すでに存在するcsvファイルとlogファイルに共通に対応できるように以下の実装仕様とする。

  • 各行の長さが10文字未満ならば例外を投げて終了
  • 各行の先頭10文字が、yyyy-mm-ddまたはyyyy/mm/ddを前提とする(書式チェックしない)
  • サブディレクトリarchiveをツールが作成する
  • ツール実行時の日付yyyy/mm/ddより前の日付を分割対象とし、当日以降は読み込みファイルに残す
  • アーカイブファイル名は"元ファイル名_yyyymmdd.元拡張子"にする

実行結果1 88141件(5/20 6:00-5/21 6:00)+テスト用に当日1件を追加したyyyy-mm-ddファイル

read  \tmp\ChartData.csv 88142 lines
write \tmp\archive\ChartData_20220520.csv 60040 lines
write \tmp\archive\ChartData_20220521.csv 28101 lines
write \tmp\ChartData.csv 1 lines

実行結果2 4562件(5/20 0:00-5/22 7:05)yyyy/mm/ddファイル

read  \tmp\LockedAuthorizedToken.log 4562 lines
write \tmp\archive\LockedAuthorizedToken_20220520.log 3473 lines
write \tmp\archive\LockedAuthorizedToken_20220521.log 1056 lines
write \tmp\LockedAuthorizedToken.log 33 lines

追記:7時基準のファイル分割ツール

r2として7時基準のファイル分割ツールを作成する。

  • 各行の長さが19文字未満ならば例外を投げて終了
  • 各行の先頭19文字が、yyyy-mm-dd hh: mm:ssまたはyyyy/mm/dd hh: mm:ssを前提として、ミリ秒は無視して、書式チェックする
  • hh < 7の場合に前日扱いにする

実行結果1 88141件(5/20 6:00-5/21 6:00)+テスト用に当日1件を追加したyyyy-mm-ddファイル

read  \tmp\ChartData.csv 88142 lines
write \tmp\archive\ChartData_20220519.csv 3 lines
write \tmp\archive\ChartData_20220520.csv 88138 lines
write \tmp\ChartData.csv 1 lines

ChartData_20220519.csvが1件のはずが3件???

2022-05-20 06:00:01,26380.0,775706.0
2022-05-20 00:00:00,26670.0,358175.0
2022-05-20 00:00:00,26670.0,358177.0

元データを確認すると、5/21に日付が変わったはずなのに5/20の2件。
PUSH APIのCurrentPriceTimeを元にしているので、API側の問題か。

2022-05-20 23:59:58,26670.0,358173.0
2022-05-20 23:59:59,26670.0,358174.0
2022-05-20 00:00:00,26670.0,358175.0
2022-05-20 00:00:00,26670.0,358177.0
2022-05-21 00:00:00,26675.0,358178.0
2022-05-21 00:00:01,26670.0,358180.0

実行結果2 4562件(5/20 0:00-5/22 7:05)yyyy/mm/ddファイル

read  \tmp\LockedAuthorizedToken.log 4562 lines
write \tmp\archive\LockedAuthorizedToken_20220519.log 1067 lines
write \tmp\archive\LockedAuthorizedToken_20220520.log 3389 lines
write \tmp\archive\LockedAuthorizedToken_20220521.log 102 lines
write \tmp\LockedAuthorizedToken.log 4 lines

githubソース

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0
Help us understand the problem. What are the problem?