【IRIS/Cache】SQLからCSVファイルを作成する

SQLを実行し、テーブルのレコードからCSVファイルを生成する方法をご紹介します。
※簡易版

※この記事は下記の方向けになります。
  • テーブルのレコードからCSVファイルを生成したい
  • テーブル毎に固有のクラスを作りたくない
  • ある程度条件を絞って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())
	}
}

【コマンド実行】
s query = “select xActive,zUpdateCount,dele,storeCd,patientId,漢字氏名,カナ氏名,ローマ字氏名,漢字旧姓,カナ旧姓,性別,生年月日,死亡日時,コメント,新患登録日,ABO血液型,RH血液型,未使用区分 from developer_csv.Patient where 漢字氏名 like ? & 性別=?”
s fileName = “D:\Temp\csv\読み込み\patient_data_sample_export2” // 拡張子なし

d ##class(developer.csv.Sample).output(fileName,,, query, “%山%”, “男”)

%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())
	}
}

【コマンド実行】
s query = [共通]
s fileName = “D:\Temp\csv\読み込み\patient_data_sample_export2.csv

d ##class(developer.csv.Sample).output(fileName,,, query, “%山%”, “男”)

解説

関数の引数を解説

引数名説明
fileNameCSVファイルの出力先(ファイル名含む)
 ※「%DisplayFormatted」の方は、ファイルの拡張子は無し
dlmデリミタ(初期値=”,”)
charSetファイルの文字コード(初期値=”UTF8″)
querySQLのクエリ
argwhere節の「?」に対応する値
「?」がなければ省略可
関数の引数を説明

「arg」は可変数の引数で、queryの「?」位置に対応した値を増やしていく必要があります。
今回の事例で行けば、「%山%」「」が該当します。

出力処理の解説

今回は、処理数を減らした簡単なサンプルを目指したので、そこまで多くを語れるほどの関数ではありません。

ODBC形式での出力を行うことがメジャーだと思うので、「%SelectMode」を1:ODBCモードに設定しています。

行の出力に関しては、「%DisplayFormatted()」と「%Print(dlm)」を使用するケースで作成しています。

%DisplayFormatted」は、結果をそのままファイルにします。
出力したファイルには拡張子が付与されるので、引数「fileName」では拡張子を付けていません。

また、コマンド自体がとてもシンプルな為、ターミナルからでもCSVファイルの出力が可能です。

%Print」は、デリミタに設定する文字列を引数にします。
こちらは、ファイルを開く(作成)する必要があるため、引数「fileName」に拡張子を含んでいます。

おわりに

今回は簡単なサンプルとして作成しました。

そのため、必要であろうと思われる他機能に関しては、除外しています。
必用に応じて、適宜追加・修正して下さい。

簡単なサンプルですが、何かの参考になれば幸いです。