SORACOM Harvest DataのデータをCSV形式で自動取得する（後編）

# 概要
SORACOM Harvest DataのデータをCSVで取得するシリーズ最終回です。
前編では環境構築、中編ではTalend Open Studio（以降TOS）を使ったJSONデータダウンロードとPythonによるCSV変換を説明しましたので、最終回では自動実行する方法を説明します。
[前編](https://qiita.com/ozk009/items/c880d234a4b91f4882d0)、[中編](https://qiita.com/ozk009/items/95eed592ff56813e6215)を読んでいない方は[前編](https://qiita.com/ozk009/items/c880d234a4b91f4882d0)から順にお読みください。

# 前提
自動実行は**常時起動のWindowsサーバーで実行**することとします。
タスクスケジューラーを使い、1日前のデータを、午前0時経過後に実行することにします。

# TOSの変更
TOSにはContext変数をいうものがあり、実行時にコマンドライン引数として渡すことが可能です。

https://qiita.com/airkoda/items/42d294fca40b81aa20fb

これを使って日付が指定できるようにします。

## 対象日の指定
中編で作成したTOSのジョブにContext変数「ctx_date」を設定し、Valueに対象の日付を`yyyy/MM/dd`の形式で設定しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/dfa6bbaf-859b-afd4-c8be-c4ebe6c2788c.png)

初期処理のfrom_strとto_strの指定方法を変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/5f671d2c-ecea-f8b4-9904-8e3e00be3aa4.png)
```java
String from_str = "2023/07/23 00:00:00";
String to_str = "2023/07/23 23:59:59";
    ↓
String from_str = context.ctx_date + " 00:00:00";
String to_str = context.ctx_date + " 23:59:59";
```

## 保存先の指定
ついでに保存フォルダを指定できるようにして、ファイル名をharvest_data.jsonからharvest_data20230723.jsonのような名前で保存できるようにします。
1. Context変数「ctx_folder」を設定し、Valueに保存先を設定しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/100c8871-0426-f369-a89e-02cff2f8220e.png)
**※ TOSのフォルダは\（円マークやバックスラッシュ）区切りではなく、/（スラッシュ）区切りで表記する必要があります。**

1. 初期処理の末尾にファイル名のグローバル変数セットを追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/93f1d192-b3e1-3771-8a0a-318c97e19095.png)
    ```java
    // 保存ファイル名
    globalMap.put("file", context.ctx_folder + "harvest_data" + context.ctx_date.replace("/", "") + ".json");
    ```

1. tFileOutputJSONのFile Nameを`(String)globalMap.get("file")`にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/2274443b-7e31-091b-d876-a197b1126693.png)

1. ついでに、tFileOutputJSONはファイルが既にファイルが存在するとエラーになるため、初期処理の後にtFileDeleteを追加し、OnSubjobOkでつなぎなおす。
    - File Name：`(String)globalMap.get("file")`
    - Fail on error：オフ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/967a57c1-b2e8-e7c3-f3b6-92f6209ac8e3.png)

以上でTOSの修正完了です。

# TOSの自動実行

## 実行モジュールの作成
1. TOSのジョブを右クリックし、「Build Job」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/30d510d6-caa5-8c57-8b86-dfe1b3a0db8b.png)

1. 「Finish」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/210aa90b-c3cc-7eca-c521-ff48d1ce46ed.png)

## 自動実行設定
ここからは実際にジョブを自動実行する常時起動のサーバー上の作業となります。
サーバーには[JDK](https://qiita.com/ozk009/items/1ca40a4d6c12285632e2#jdk)と[Python（pandas）](https://qiita.com/ozk009/items/bb917529e13f65aa7b8d)のインストールを行っておいてください。
**※ TOSのインストールは不要です**

### バッチファイルに処理を追加
実行モジュールの作成で作ったZIPファイルを任意のフォルダに展開し、「HarvestData」の中にあるバッチファイル「HarvestData_run.bat」を以下の通り編集（<font color="red">赤字部</font>を追記・<font color="green">緑字</font>は説明文）する。
> %~d0
> cd %~dp0
>
> <font color="green">昨日の日付を取得</font>
> <font color="red">for /f %%i in ('powershell -Command "& {$yesterday = (Get-Date).AddDays(-1); $yesterday.ToString('yyyy/MM/dd')}"') do set YESTERDAY=%%i</font>
>
> <font color="green">対象日と保存先フォルダをContext変数として追記</font>
> java -Dtalend.component.manager.m2.repository="%cd%/../lib" -Xms256M -Xmx1024M (略) local_project.harvestdata_0_1.HarvestData --context=Default %* <font color="red">--context_param ctx_date=%YESTERDAY% --context_param ctx_folder=（ファイルの保存フォルダ）</font>
> 
> <font color="green">JSON→CSVの変換</font>
> <font color="red">set YYYYMMDD=%YESTERDAY:/=%</font>
> <font color="red">python C:\work\tos\soracom_json_csv.py （ファイルの保存フォルダ）harvest_data%YYYYMMDD%.json</font>

**※ ファイルの保存フォルダは\（円マークやバックスラッシュ）区切りではなく、/（スラッシュ）区切りで表記する必要があります。**

### タスク設定
編集したバッチファイル「HarvestData_run.bat」の実行を登録する。
1. タスクスケジューラを起動し、「タスクの作成」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/4bb0104c-12cc-9f28-2d2a-844211826048.png)
1. 名前に「HarvestData」を入力し、「ユーザーがログオンしているかどうかにかかわらず実行する」を選択し、「最上位の特権で実行する」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/ef32f1be-367f-3ff1-3676-c26c9a465ab2.png)
1. 「トリガー」を選択し、「新規」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/6025fcc7-2659-2782-470b-70d69f871eef.png)
1. 「毎日」を選択し、実行する時刻を指定し、「OK」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/0b195381-b36e-9a9f-5d8d-6a7a1b32f487.png)
1. 「操作」を選択し、「新規」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/628470cc-4f6b-776a-faa9-5bfd996628ea.png)
1. プログラム/スクリプトで「HarvestData_run.bat」のパスを指定し、「OK」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/459d9319-b93e-164f-bd01-d5396b918c46.png)
1. 「OK」をクリックすると、パスワードを求められるのでパソコンのログインパスワードを入力し、「OK」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/bb721409-b47e-04b6-f6b1-22d577d68ad2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/ff738367-f5dd-908b-e564-4e605a252fcc.png)

以上で自動実行の設定完了です。

# おわりに
当初考えていた以上の大作となってしまいました。
馴染みのない方には難しい内容になってしまったと反省していますが、どなたかのお役に立てたら幸いです。