【第8回】CSVの処理について

#はじめに
今回はHeartCore Roboにおける使用頻度の高い機能であるCSV処理をカバーします。

1)　既存CSVファイルの読込
2)　新規CSVファイルの作成・既存CSVファイルへのデータ追加

サンプルスクリプトも記載しています。CSV読込・作成以外の汎用的に使用出来る機能も使用していますので、是非トライしてみて下さい。

# CSVファイルの読込
HeartCore Roboでデフォルトで用意されているコマンドテンプレートを使用することでCSVファイルの読込とカンマ区切りのデータ取得が用意に行えます。CSVから取得したデータは変数（｛VALUE｝）に格納されます。

使用するCSVファイルの例：
>品名,単価,数量
りんご,200,2
みかん,100,3
なし,250,3
バナナ,200,3
もも,500,2

**注：WindowsでNotepadを使用してCSVを作成する場合には、保存する際に文字コードをUTF-8を選択して下さい。**

1. コードテンプレート > For文 > CSVファイルのデータを繰り返す
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/f42323ae-0061-655f-2319-364e5d954ee4.png)

2. CSVファイル処理のコマンドテンプレートが追加（デフォルトで指定されているCSVが存在しないため、何箇所のコードが赤線（エラー）で表示されています）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/5eaaa799-f794-a5e8-3d11-5e3d8812faa2.png)

3.  File open..行の「file="mydata.csv"」ハイライト（灰色表示）箇所を右クリック > プロパティ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/3fe26e34-86b0-0e9e-8c6a-1261764f6945.png)

4. File openコマンドのプロパティ画面が開く > 開くファイル右側の...をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/3e261fbe-eb31-e6c8-6bb6-88d17a67da8e.png)

5. CSVファイルを選択 > 開くをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/2843852e-349c-ddbd-deaf-18896a4d8bce.png)

6. プロパティ画面のOKをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/006a319c-f597-9aa0-e23a-644fc2dd6951.png)

7. CSV処理を行うコマンドが追加（指定した箇所にCSVファイルが存在するため赤線（エラー）が消えます）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/6d5e483b-5e22-b5ef-e192-c5f4bad13615.png)

8. 変数｛VALUE｝にカンマ区切りまで含めたCSVデータが代入されます。変数に取得が出来ているか確認するためにLogコマンドを追加
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/7fb04572-5015-1cd5-8832-a5b222c29c74.png)
> Log {VALUE}

9. ロボットを実行
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/57a8c4ea-8b52-b7ab-c16b-33d862e659e2.png)

10. ログにCSVファイルのデータが出力されている事を確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/a57c8004-72c5-e5c6-211a-1788b0438e16.png)

11. ヘッダー行がある場合で出力が不要な場合はfor文で指定している開始行を"2"に変更
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/a31218e8-269a-b06f-f5d9-d69d65740c88.png)

12. 実行 > 結果でヘッダー行の処理が行われていない事を確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/bfde79ce-037d-b3ad-ce27-87ffaa929bb1.png)

応用例：
CSVファイルへのパスをスクリプト冒頭の変数で宣言、File openコマンドで変数を指定することも可能です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/7f11561e-12d8-9c25-26f3-185585a24622.png)

##CSVファイル読込のサンプルスクリプト
ロボットにWindowsアプリケーションのノートパッドを起動させて、指定したCSVファイルを読み込み、カンマ区分した値をスペース区切りを入れながらノートパッドに転記します。下記のサンプルは、プロジェクトフォルダ直下に「CSV」というフォルダを事前に作成、上記のデータを使用したCSVを事前に用意しておく必要があります。

下記サンプルは、Windows機能である「ファイル名を指定して実行」をショートカットを使い、Notepadのアプリケーション名を指定します。使用出来るのはWindows端末のみですが、**「ファイル名を指定して実行」はアイコンをクリックせずにアプリケーションの起動が出来るので大変便利な機能です。**「ファイル名を指定して実行」の使い方は別の回でもカバーします。

```javascript
//既存のCSVファイルを指定（プロジェクトフォルダ直下「CSV」フォルダにある「注文データ.csv」を指定
File "open" file="..\CSV\注文データ.csv"

//「ファイル名を指定して実行」（Windows+R）を使用してNotepadを起動
Press "Windows+R"
Paste "Notepad"
Press "Enter"

//Notepadの起動を3秒待つ
Wait 3s

//CSVの行数を取得してループ文の上限カウンタに指定・2行目から開始
for (line=2; {line}<{_FILE_LINE_COUNT}; line={line}+1) {
    
    //各行のカンマ区切りデータをカンマ毎に区分
    File parse line={line}
    
    //カンマ毎に区分された件数をループ文の上限カウンタに指定・1カラム目から開始
    for (column=1; {column}<{_FILE_PARSE_COUNT}+1; column={column}+1) {
        //各カラムのデータを変数VALUEに格納
        Var VALUE={_FILE_PARSE_VALUE{column}}
        //Notepadに貼付
        Paste {VALUE}
        //スペース貼付
        Paste " "
    }
}


Report "results.xml"

```
スクリプトを実行すると、ロボットがノートパッドに値を転記する動作が確認出来ます。テキストファイルへの転記は本来はバックエンド（ノートパッドを起動すること無く）実行出来ますが、ロボットの実動作を見るためのサンプルともなっています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/2643dd80-78f7-2a2e-f7b1-fc8cf8988b7e.png)


#CSVファイルの作成
CSVを新規に作成する場合には、File appendコマンドを使用してファイルの末尾にカンマ区切りがある文字列を追加していきます。

1.　(新規にCSVファイルを追加する場合)空白行で右クリック > コマンドを作成 > Click File > File >　File Createを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/dfb03c01-b7ee-18c5-1996-843c08465e77.png)

>既存のCSVファイルの末尾にCSV行を追加する場合にはコマンドを作成 > Click File > File >　File openを選択

2.　プロパティ画面 > ...をクリックしてファイルパス選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/96e8b6b6-d77e-f6d9-5ccb-db9702c14ca0.png)

3.　任意の出力先フォルダ上で任意のファイル名を入力
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/288439d2-7414-4a98-d996-5b586959fbf1.png)

>既存のCSVファイルの末尾にCSV行を追加する場合には既存のCSVファイルを選択

4.　CSV出力のファイルパスが入力された事を確認してOKボタンをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/eb4d212a-62b0-3ce8-1385-358479c203f4.png)

5.　File createコマンドが追加された事を確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/ed65c515-40af-3532-060c-4c538a510196.png)

6.　直下の空白行で右クリック > コマンドを作成 > Click File > File >　File Appendを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/22616eac-232a-39bd-28b7-e9e986ca4f0f.png)

7.　追加するテキストにCSV行を記入 > OKをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/7d62238a-dea2-186b-90d3-0e2d84888294.png)
*追加するテキストに変数（｛｝で囲む）を指定することも可能です*

8.　File appendコマンドが追加された事を確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/7ad085ce-530b-bb5f-d04f-4d9340c6a336.png)

9.　　直下の空白行で右クリック > コマンドを作成 > Click File > File >　File closeを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/773a7587-ad26-7112-afae-3514cfa21e30.png)

10.　「ファイルが変更されている場合は変更を保存します」にチェック > OKをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/cb9444cb-cd3b-5514-9552-1e1f90450d20.png)

11.　追加されたFile appendコマンド全体をハイライト > コピー(CTRL+V) > 直下行でペースト > 「改行コード」のエスケープシーケンスである"¥n"を追加
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/dd8267fa-48ac-4f75-d1a5-1057878f1bfc.png)

*HeartCore RoboのエスケープシーケンスはJavaエスケープシーケンスに準拠します。
（HeartCore Roboエスケープシーケンス）
https://www.heartcorerobo.com/hcrobodesktop/docs/scripting/commref.html#varf
（Javaのエスケープシーケンス）
https://www.javadrive.jp/start/num/index4.html*

12.　File closeコマンドが追加されてsave="true"と指定されている事を確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/59f4ff9b-460a-685c-0ff8-69e1a435ebe1.png)

13.　ロボットを実行
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/57a8c4ea-8b52-b7ab-c16b-33d862e659e2.png)
14.　指定したフォルダにCSVが出力されているのを確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/b6986621-ee53-675b-6746-36cfbc2fab03.png)

15.　出力を確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/59dc4b3e-642a-f1ee-3172-74b3aecb5a42.png)
*上記の例ではNotepad++で確認しています。Windowsノートパッドでは改行コードが認識されず改行として表示されない場合があります*

##CSVファイル作成のサンプルスクリプト
For文を使用して10行＊5カラムのCSVファイルを新規に作成します。下記のサンプルは、プロジェクトフォルダ直下に「CSV出力」というフォルダを事前に作成しておく必要があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/e6718091-f2f7-1a7d-13c0-78135228a926.png)

```javascript
//新規CSVファイル出力先をプロジェクトフォルダ直下「CSV出力」フォルダに、ファイル名を「CSV出力.csv」と指定
File "create" file="..\CSV出力\CSV出力.csv"

//CSV行データ用変数の宣言
Var CSVLine=""

//行数分のループ(10回)
for (i=1; {i}<11; i={i}+1) {
    
    //CSV行データ1カラム目に行数をセット
    Var CSVLine="{i}"
    
    //1行内カラム分のループ(5回)
    for (j=0; {j}<5; j={j}+1) {
        
        //CSV行データ2カラムー5カラム目にカンマを入れて数字をセット
        Var CSVLine="{CSVLine},{j}"
    }
    
    //CSV行を末尾に追加
    File "append" text="{CSVLine}"
    //改行コード追加
    File "append" text="\n"
    
    //CSV行データのクリア
    Var CSVLine=""
}

//CSVファイルを保存して閉じる
File "close" save="true"

Report "results.xml"

```
指定したフォルダにCSVファイルが出力されています。Excelかノートパッドアプリケーションで開いて内容を確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/445d1e45-d282-08eb-6d12-f6884a2a477f.png)
↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/9c996dfd-2e2f-d9a9-977e-ef28cefe3f3e.png)

既存のCSVファイルに対して行を追加したい場合には、冒頭行のFile "create"からFile "open"にコマンドを変更して既存のCSVファイルを指定します。
>File "create" file="..\CSV出力\CSV出力.csv"

↓

>File "open" file="..\CSV出力\CSV出力.csv"
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/7920b264-934b-55fe-70a2-dbb5783ec6aa.png)


#次回について
次回は、「ファイル名を指定して実行」を使用してのアプリケーションの起動の便利な使い方や、特定のフォルダ内のファイル全てに対して何かしらの処理を行うために、「フォルダ内のファイル名一覧取得方法について」をカバーする予定です。