SQLを実行し、テーブルのレコードからCSVファイルを生成する方法をご紹介します。
※簡易版
はじめに
テーブルのレコードから、CSVファイルを作成する方法をご紹介します。
今回の方法は、SQLを利用してデータの絞り込みを行いCSVファイルの出力を行います。
また、SQLの組み方次第では、二つのテーブルをjoinしたデータを出力する事も可能なので、汎用性が高いです。
また、テーブル毎の出力関数を作成する必要がないのもメリットです。
テーブル単位での全件CSV出力に関しては、下記記事を参照してください。
CSVファイルをエクスポートする
SQLを使用してCSVファイルを出力するので、必要なのは「SQLを実行する」「ファイルに出力する」の2つの機能になります。
この2つの機能を元に、簡単なサンプルを2つ程作成しました。
関数の解説は後程行います。
%DisplayFormattedを使用するケース
CSV出力に必要な処理は3行のみ
ClassMethod output(fileName As %String, dlm As %String = ",", charSet As %String = "UTF8", query As %String, arg...)
{
#dim rset as %SQL.StatementResult
#dim messages as %SQL.Manager.Messages
try {
s stmt = ##class(%SQL.Statement).%New(1)
, rset = stmt.%ExecDirect(, query, arg...)
d rset.%DisplayFormatted("CSV", fileName, .messages, .filesUsed, charSet, dlm)
w !,"◆結果:",!
d messages.%Display()
w !!,"◆ファイル名:",!
zw filesUsed
}catch e {
w !,$System.Status.DisplayError(e.AsStatus())
}
}
%Printを使用するケース
ClassMethod output(fileName As %String, dlm As %String = ",", charSet As %String = "UTF8", query As %String, arg...)
{
#dim rset as %SQL.StatementResult
try {
s stmt = ##class(%SQL.Statement).%New(1)
, rset = stmt.%ExecDirect(, query, arg...)
s flg = "WNS"_$s(charSet'="":"K\"_charSet_"\", 1:"")
// 出力
open fileName:(flg):5
use fileName while rset.%Next() { d rset.%Print(dlm) }
close fileName
}catch e {
w !,$System.Status.DisplayError(e.AsStatus())
}
}
解説
関数の引数を解説
引数名 | 説明 |
---|---|
fileName | CSVファイルの出力先(ファイル名含む) ※「%DisplayFormatted」の方は、ファイルの拡張子は無し |
dlm | デリミタ(初期値=”,”) |
charSet | ファイルの文字コード(初期値=”UTF8″) |
query | SQLのクエリ |
arg | where節の「?」に対応する値 「?」がなければ省略可 |
「arg」は可変数の引数で、queryの「?」位置に対応した値を増やしていく必要があります。
今回の事例で行けば、「%山%」「男」が該当します。
出力処理の解説
今回は、処理数を減らした簡単なサンプルを目指したので、そこまで多くを語れるほどの関数ではありません。
ODBC形式での出力を行うことがメジャーだと思うので、「%SelectMode」を1:ODBCモードに設定しています。
行の出力に関しては、「%DisplayFormatted()」と「%Print(dlm)」を使用するケースで作成しています。
「%DisplayFormatted」は、結果をそのままファイルにします。
出力したファイルには拡張子が付与されるので、引数「fileName」では拡張子を付けていません。
また、コマンド自体がとてもシンプルな為、ターミナルからでもCSVファイルの出力が可能です。
「%Print」は、デリミタに設定する文字列を引数にします。
こちらは、ファイルを開く(作成)する必要があるため、引数「fileName」に拡張子を含んでいます。
おわりに
今回は簡単なサンプルとして作成しました。
そのため、必要であろうと思われる他機能に関しては、除外しています。
必用に応じて、適宜追加・修正して下さい。
簡単なサンプルですが、何かの参考になれば幸いです。