IBM i 上で CSVファイルの出力
IBM i で DB に保存されているデータをCSVとして出力する方法を試してみました。
CSVファイルの書き出しは、Excelで開きたいといった場合があるので、使われている方も多いのではないでしょうか?
今回は、CSVファイルをJSONファイルに変換するときどうすれば良いか?という話を聞いたので、JSONファイルに書き出すことを目的としてCSVファイルの書き出しについて見ていきたいと思います。
本記事は、IBM i 7.5 環境を元に記載しております。
CPYTOIMPF
CSVへの書き出しは、CPYTOIMPF
を利用します。
CPYTOIMPF 自体は、物理ファイルをIFS(統合ファイル・システム)上のファイルに書き出したり、ファイルにレコードを追加したりといったことができます。
ドキュメントを見てみると、オプションのパラメーター数がなかなか多く、少し大変そう。
JSONファイルに書き出したり、CSVとして扱うときに便利であろう設定を紹介していきます。
サンプルデータ
CPYTOIMPF の動きを見るに当たって、サンプルとなるデータを準備しました。
下記のテーブルを用意し、適当なデータを入れています。
- 商品マスター
- CSHSHCD : 商品コード
- CSHSHNK : 商品名称(カナ)
- CSHSHNR : 商品名称(略称)
- CSHSHNM : 商品名(伝票用)
- CSHHB1C : 分類コード
- CSHHB2C : 中分類コード
- CSHHB3C : 小分類コード
- CSHTMN1 : 単位名1(漢字)
- CSHTMN2 : 単位名2(漢字)
- CSHTMN3 : 単位名3(漢字)
- CSHKUGP : 標準小売売価
- CSHSPG1 : 標準仕入単価
- CSHHPG1 : 販売価格
データの一部の抜き出すと、このような感じです。
CSHSHCD | CSHSHNK | CSHSHNR | CSHSHNM | CSHHB1C | CSHHB2C | CSHHB3C | CSHTMN1 | CSHTMN2 | CSHTMN3 | CSHKUGP | CSHSPG1 | CSHHPG1 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
8010301 | センシャスポンジ | 洗車スポンジ | 洗車スポンジ | 2 | 1 | 1 | バラ | ボール | ケース | 300 | 207 | 270 |
8010302 | センシャブラシ | 洗車ブラシ | 洗車ブラシ | 2 | 1 | 1 | バラ | ボール | ケース | 260 | 189 | 238 |
8010303 | ツヤダシラバー | つや出しラバー | つや出しラバー | 2 | 1 | 1 | バラ | ボール | ケース | 550 | 398 | 495 |
8010304 | テンネンハチミツワックス | 天然蜂蜜ワックス | 天然蜂蜜ワックス | 2 | 1 | 1 | バラ | ボール | ケース | 900 | 765 | 880 |
8010305 | ワックススプレータイプ | ワックススプレー | ワックススプレータイプ | 2 | 1 | 1 | バラ | ボール | ケース | 400 | 288 | 360 |
データは、DEMO/DEMOTABLE
として作成しています。
実行例
まずは、実行例を見ていきたいと思います。
その後、各パラメーターについて記述していきたいと思います。
実行するコマンドは、下記のようになっています。
CPYTOIMPF FROMFILE(ライブラリー/ファイル) TOSTMF(出力先のストリームファイル) MBROPT(*REPLACE) STMFCCSID(01208) RCDDLM(*LF) RMVBLANK(*BOTH) ADDCOLNAM(*SQL)
では、実際に動かしてみます。
DEMO/DEMOTABLE
のデータをすべて cpytoimpf_output.csv
に書き出してみます。
CALL QCMD
を実行した上で、コマンド実行を行っています。
実行すると、「DEMOのファイルDEMOTABLEからすべてのレコードがコピーされた。」という表示が出ます。
WRKLNK
で確認してみると、 ファイルができているのがわかりますね。
中身を見ると、カンマ区切りでデータが入っているのでちゃんとCSVとして開けそうです。
IFS上で確認してみると、このように表示されます。
個人的には、こちらのほうが見やすいので好きです。
demo # cat cpytoimpf_output.csv
"8010302","センシャブラシ","洗車ブラシ","洗車ブラシ","2","1","1","バラ","ボール","ケース",260,189.00,238.00
"8010303","ツヤダシラバー","つや出しラバー","つや出しラバー","2","1","1","バラ","ボール","ケース",550,398.00,495.00
"8010304","テンネンハチミツワックス","天然蜂蜜ワックス","天然蜂蜜ワックス","2","1","1","バラ","ボール","ケース",900,765.00,880.00
"8010305","ワックススプレータイプ","ワックススプレー","ワックススプレータイプ","2","1","1","バラ","ボール","ケース",400,288.00,360.00
"8020101","ヘルメット フル","ヘルメット フル","ヘルメット フル","2","2","1","バラ","ボール","ケース",6200,3840.00,4800.00
"8020102","ヘルメット","ヘルメット","ヘルメット","2","2","1","バラ","ボール","ケース",6000,3560.00,4450.00
"8020103","グローブ","グローブ","グローブ","2","2","1","バラ","ボール","ケース",4800,3040.00,3800.00
"13010101","フードオオブクロ","フード 大袋","フード 大袋","1","4","3","バラ","ボール","ケース",700,585.00,630.00
パラメーターについて
それでは、こちらのコマンドをパラメーターに分けて見ていきます。
CPYTOIMPF FROMFILE(ライブラリー/ファイル) TOSTMF(出力先のストリームファイル) MBROPT(*REPLACE) STMFCCSID(01208) RCDDLM(*LF) RMVBLANK(*BOTH) ADDCOLNAM(*SQL)
-
FROMFILE(ライブラリー/ファイル)
CSVに書き出す対象となるファイルを指定します。
今回の場合だと、DEMO/DEMOTABLE
になります。
-
TOSTMF(出力先のストリームファイル)
IFS上に書き出すファイル名を指定します。
絶対パスで記述が必要なので、注意が必要です。
-
MBROPT(*REPLACE)
書き出す際に、置き換えをするか追記をするか書き出しの方式を選択できます。
指定できる値は、以下の2つとなっています。- ファイルの置き換え : *REPLACE
- ファイルに追加 : *ADD
-
STMFCCSID(01208)
書き出したファイルのCCSIDを選択できます。
JSONへの変換を想定しているため、扱いやすい UTF-8 (01208) を指定しています。
※ JSONへの書き出しについては、別の記事で書こうと思っています。
-
RCDDLM(*LF)
レコードの区切り文字を指定します。
いわゆる改行コードを指します。
OSによって、使用される改行コードが異なるため、注意が必要です。
LF
を指定していますが、これはUNIXで使われる改行コードです。CR
を指定すると、WRKLNKなどで見た場合は改行されているように見えます。
ただ、vi (エディタ) などで開いてみると、下記の画像のように^M
が表示され、改行もされていません。これは、PASEが
CR
に対応していないためです。
WindowsはCRLF
, MacはCR
だったのですが、最近だとどれでも開けるようです。基本的には、
LF
で書き出しておくのが無難でしょう。
-
RMVBLANK(*BOTH)
ブランクの除去を行います。
IBM i のDBの場合、固定長のカラムでは一定の文字数に達していないデータには空白が含まれます。
CSVで書き出すデータには、空白部分は必要ないため削除します。
-
ADDCOLNAM(*SQL)
カラム名を追加します。
CPYTOIMPFは、ファイルに入っているデータすべてを書き出すため、一部のデータを書き出したい場合には、先に必要なデータを抽出したファイルを作成しておく必要があります。
他にもいくつかパラメーターはありますが、用途に合わせて使い分けるのが良いかと思います。
例えば、日付や時間、小数点の出力形式を指定することも可能です。