【IRIS/Cache】CSVファイルを読み込む

今回はCSVファイルの読み込みについて解説いたします。

CSVファイルを取り込みたい方は、この記事を一読していただけると幸いです。

※この記事は下記の方向けになります。
  • CSVファイルを読み込んで、データの加工を行うケース
  • 独自のCSVパーサーがない

はじめに

CSVファイルの読み込みは、「%SQL.Util.Procedures.cls」のプロシージャ「CSV」を使用します。
プロシージャ「CSV」を使用すると、行ごとにインスタンス化されたデータが取得でき、そこから各セルのデータを取得します。

サンプル用として、3カラム2行のCSVファイルを準備しました。
 ※CSVにヘッダはありません。

nonamebirthday
10000000藤原道長1980-09-02
10000001紫式部2021-09-02
SampleCSV.csv

読み込み

CSVファイルを読み込む処理が、下記サンプルです。

変数「rowType」に各カラムの名称データ型を用意し、2番目の引数としてます。
3番目の引数には、CSVファイルのフルパスを配置します。

Class developer.csv.Sample
{

ClassMethod main(fileName As %String)
{
	s sts = $$$OK
	try {
		// CSVファイルのカラム情報
		s rowType = "no NUMERIC, name VARCHAR, birthday VARCHAR"
		
		s result = ##class(%SQL.Statement).%ExecDirect(,"call %SQL_Util.CSV(,?,?)", .rowType, fileName)
		s rset = result.%NextResult()
		while(rset.%Next()){
			w !,rset.no,",",rset.name,",",rset.birthday
		}
	}catch e {
		s sts = e.AsStatus()
	}
	q sts
}
}

では、読み込んでみましょう。
下記コマンドをターミナルから実行します。

d ##class(developer.csv.Sample).main("D:\Temp\csv\SampleCSV.csv")

実行結果です。正常に読み取れていることが分かります。

CSV取り込み結果

CSVのカラム情報ファイル名を、「%SQL.Util.Procedures.cls」のプロシージャ「CSV」に渡すだけなので、かなり簡単にCSVファイルの取得ができます。

プロシージャの引数

先ほどは「第2引数=カラム情報」「第3引数=CSVファイル名」を引数としましたが、引数は他にもあります。

引数の説明です。

番号名称説明
1selectModeデータ形式の定義(0:logical, 1:ODBC, 2:Display)
 ※指定してもあまり変わらないような・・・
2rowTypeカラム情報。カラム名と型をカンマ区切りで設定する。
3fileNameファイル名かストリームorefを渡す
4delimiterデリミタ。初期値はカンマ。TSVでは$c(9)を渡す。
5quote引用符文字。デフォルトは二重引用符。デフォルト値で十分。
6translateTableエンコーディングの指定(RAW,UTF8,SJIS,UnicodeLittle,UnicodeBig等)
指定しなくても大体うまい事やってくれる
引数一覧

その他の仕様

コメント行

行の先頭に「–」がついていると、コメントとみなして行の取得を行いません。

ヘッダ情報をファイルに埋め込む

カラム情報をCSVファイルに組み込むことで、rowTypeをnullで記述する事が可能です。
汎用的な読み込みを行いたい場合に有効な手段だと思います。

先ずは、先ほどのサンプルから9行目のrowTypeを「null」に変更しています。

Class developer.csv.Sample
{
ClassMethod main(fileName As %String)
{
	s sts = $$$OK
	try {
		s result = ##class(%SQL.Statement).%ExecDirect(,"call %SQL_Util.CSV(,?,?)", "", fileName)
		s rset = result.%NextResult()
		while(rset.%Next()){
			w !,rset.no,",",rset.name,",",rset.birthday
		}
	}catch e {
		s sts = e.AsStatus()
	}
	q sts
}
}

読み込むCSVファイルに細工を加えます。
第一行目に、コメントアウトしたカラム行を追加しました。
 →「–no NUMERIC, name VARCHAR, birthday VARCHAR

nonamebirthday
–no NUMERICname VARCHARbirthday VARCHAR
10000000藤原道長1980-09-02
10000001紫式部2021-09-02
SampleCSV.csv

おわりに

今まで、「CSVファイルなんて$pieceで十分だよ!」って力業で解決していましたが、こんな便利なプロシージャあるんですよね。

今後CSVファイルを読み込む機会があれば、超楽にPG組めちゃいますね!