【MotionBoard】CSVをアップロード後、自動でファイルも削除したりバックアップしたい！

# やりたいこと
MotionBoardと呼ばれるBIツールは様々なデータを集約し、グラフや3Dマップ、地図など色々な表現方法でビジュアル化可能なツールです。

https://www.wingarc.com/product/motionboard/index.html

商用DB（OracleやSQL Server）だけでなく、CSVやExcelといったファイルデータも可視化することができます。
CSV連携の場合、手動でMotionBoardにアップロードすることも可能ですが、MotionBoard Agentというツールで自動化することも可能です。

https://cs.wingarc.com/manual/mb/6.2/ja/UUID-248eedd3-ba27-69fd-530d-0d1efbc51c68.html

ただし、**アップロード後、元ファイルは残り続けます。**
上位システムから、常に上書きする形でCSVを出力すればMotionBoard側で常に最新のデータが反映されますが、様々な事情によって元ファイルは削除する必要があったり、日時情報を付けて蓄積（バックアップ）をしたい場合があります。
今回、**CSVファイルをアップロード後、自動で元ファイルを削除またはバックアップするバッチファイルを作成しました。**
タスクスケジューラなどで１日１回実行するといった使い方になります。

# アップロード後、自動で元ファイルを削除するバッチファイル

![remove.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254022/1a7591a1-4a9c-59c1-d53d-68309a87faed.gif)


### 動作解説
1. 各種必要情報（アップロード元のファイルの場所や、MotionBoardへのアクセス情報など）をセット
2. アップロード元のCSV（local_csv_path：C:\Data\sample.csv）が存在するか確認
    * 存在した場合、MotionBoardのAPIを使ってアップロード。アップロード先はshared_csv_path（test/test.csv）で指定。
        存在しない場合、何もしない。
    * エラーがない場合、アップロード元のCSVを5秒後に削除
        エラーが発生した場合、削除はせず、エラーメッセージをログに書き込み
3. 30秒後、再び2. を実行

```batchfile
@echo off

@REM -----------------------------------------------------------
@REM local_csv_path: サーバー上のCSVファイルの場所 e.g. C:\Data\sample.csv
@REM server: MotionBoardのサーバー名 e.g. cloud-up.motionboard.jp
@REM tenant: テナント名 e.g. ab123cde
@REM id: ユーザーID e.g. username
@REM pw: パスワード e.g. password
@REM shared_csv_path: 保存先となるMotionBoardの共有フォルダの場所 e.g. test/test.csv

@REM log_file_path: ログファイルの場所 e.g. C:\logs\API_auto_UL.log

set local_csv_path=C:\Data\sample.csv
set server=cloud-up.motionboard.jp
set tenant=ab123cde
set id=username
set pw=password
set shared_csv_path=test/test.csv

set log_file_path=C:\logs\API_auto_UL.log
@REM -----------------------------------------------------------

setlocal enabledelayedexpansion

@REM　ログファイル書き込みのためのディレクトリ作成
for %%f in (%log_file_path%) do (
  set log_folder_path=%%~dpf
)

if not exist %log_folder_path% (
  echo ログファイルを書き込むフォルダがありません。作成します。
  md %log_folder_path%
)

echo %date% %time% プログラムを開始しました。 >> %log_file_path%

:roop

if exist %local_csv_path% (
  echo %local_csv_path%: ファイルの存在を確認。MotionBoard（%shared_csv_path%）へアップロードをします。>> %log_file_path%
  set http_code=
  FOR /F %%i in ('curl.exe -X POST -F "uploadFile=@%local_csv_path%" -F "tenant=%tenant%" -F "id=%id%" -F "pw=%pw%" -g https://%server%/motionboard/rest/csv/put/shared/%shared_csv_path% -w "%%{http_code}" -s') DO SET http_code=%%i
  echo ステータスコード：!http_code:~-3! >> %log_file_path%
  if !http_code:~-3! == 200 (
    echo ファイルを削除します。>> %log_file_path%
    timeout 5
    del %local_csv_path%
  ) else (
    echo エラーメッセージ： >> %log_file_path%
    echo !http_code:~0,-3! >> %log_file_path%
  )
) else (
  echo ファイルが存在しません。なにもしません。>> %log_file_path%
)

timeout 30

goto :roop

```
### ログファイルの出力サンプル
ログファイルにはこんな形で出力されます。
１度目は間違ったユーザー名を指定して実行した際のログです。認証エラーのメッセージが出力されています。
２度目はユーザー名を修正して実行し、アップロードに成功している様子です。以降CSVファイル（sample.csv）が指定のフォルダ（C:\Data\）に作成されるまで何もしません。

```text
2023/02/23 23:58:40.86 プログラムを開始しました。 
C:\Data\sample.csv: ファイルの存在を確認。MotionBoard（test/test.csv）へアップロードをします。
ステータスコード：401 
エラーメッセージ： 
{"code":"E-COMMUNICATOR-02000","message":"認証エラーが発生しました。ユーザーIDまたはパスワードが不正です。"} 
2023/02/24  0:02:07.13 プログラムを開始しました。 
C:\Data\案件データ.csv: ファイルの存在を確認。MotionBoard（test/test.csv）へアップロードをします。
ステータスコード：200 
ファイルを削除します。
ファイルが存在しません。なにもしません。
ファイルが存在しません。なにもしません。
```

# アップロード後、自動でファイル名に日時を付与して移動するバッチファイル
どちらかというと、こちらのほうが需要があるかもしれません。
CSVファイルのアップロードが成功すると、指定したフォルダに日時情報を付与して移動させます。
e.g. C:\Data\sample.csv -> C:\Data\backup\sample_20230223_230239.csv

![move.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254022/fd495d7a-a707-5872-610b-daa2878733d3.gif)

![2023-02-24_00h12_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254022/e8238cd9-8c21-909d-3019-da6d452307a0.png)



```bat
@echo off

@REM -----------------------------------------------------------
@REM local_csv_path: サーバー上のCSVファイルの場所 e.g. C:\Data\sample.csv
@REM move_to_path: 移動先のフォルダの場所 e.g. C:\Data\backup\
@REM server: MotionBoardのサーバー名 e.g. cloud-up.motionboard.jp
@REM tenant: テナント名 e.g. ab123cde
@REM id: ユーザーID e.g. user_name
@REM pw: パスワード e.g. password
@REM shared_csv_path: 保存先となるMotionBoardの共有フォルダの場所 e.g. test/test.csv

@REM log_file_path: ログファイルの場所 e.g. C:\logs\API_auto_UL.log

set local_csv_path=C:\Data\sample.csv
set move_to_path=C:\Data\backup\
set server=cloud-up.motionboard.jp
set tenant=ab123cde
set id=username
set pw=password
set shared_csv_path=test/test.csv

set log_file_path=C:\logs\API_auto_UL.log
@REM -----------------------------------------------------------

setlocal enabledelayedexpansion

@REM　ログファイル書き込みのためのディレクトリ作成
for %%f in (%log_file_path%) do (
  set log_folder_path=%%~dpf
)
if not exist %log_folder_path% (
  echo ログファイルを書き込むフォルダがありません。作成します。
  md %log_folder_path%
)

echo %date% %time% プログラムを開始しました。 >> %log_file_path%

@REM 移動先フォルダの存在確認と、ファイル名への日時付与処理
if not exist %move_to_path% (
  echo 移動先のフォルダがありません。作成します。>> %log_file_path%
  md %move_to_path% >> %log_file_path%
)
set tmp=%time::=% 
set hhmmss=%tmp:~0,6%
for %%f in (%local_csv_path%) do (
  @REM 日時情報の付与： C:/Data/sample_yyyyMMdd_hhmmss.csv
  set move_to_file=%move_to_path%%%~nf_%date:/=%_%hhmmss%%%~xf%
)

:roop

if exist %local_csv_path% (
  echo %local_csv_path%: ファイルの存在を確認。MotionBoard（%shared_csv_path%）へアップロードをします。>> %log_file_path%
  set http_code=
  FOR /F %%i in ('curl.exe -X POST -F "uploadFile=@%local_csv_path%" -F "tenant=%tenant%" -F "id=%id%" -F "pw=%pw%" -g https://%server%/motionboard/rest/csv/put/shared/%shared_csv_path% -w "%%{http_code}" -s') DO SET http_code=%%i
  echo ステータスコード：!http_code:~-3! >> %log_file_path%
  if !http_code:~-3! == 200 (
    echo ファイルを移動します。>> %log_file_path%
    timeout 5
    move %local_csv_path% %move_to_file% >> %log_file_path%
  ) else (
    echo エラーメッセージ： >> %log_file_path%
    echo !http_code:~0,-3! >> %log_file_path%
  )
) else (
  echo ファイルが存在しません。なにもしません。 >> %log_file_path%
)

timeout 30

goto :roop


```

# おわりに
本記事ではMotionBoardへCSVをアップロード後、自動で削除したり移動したりするバッチファイルを紹介しました。
今回はMotionBoardを例に紹介しましたが、「アップロード→自動削除/移動」の仕組み自体は色々なシーンで使うことができそうなので、ぜひ使ってみてください。
MotionBoardのAPIや使い方についてはこちらの記事が参考になるのでぜひ。

https://qiita.com/Ryo---san/items/13e4ed2ffe6c7eb44d27