今回はCSVファイルの読み込みについて解説いたします。
CSVファイルを取り込みたい方は、この記事を一読していただけると幸いです。
はじめに
CSVファイルの読み込みは、「%SQL.Util.Procedures.cls」のプロシージャ「CSV」を使用します。
プロシージャ「CSV」を使用すると、行ごとにインスタンス化されたデータが取得でき、そこから各セルのデータを取得します。
サンプル用として、3カラム2行のCSVファイルを準備しました。
※CSVにヘッダはありません。
no | name | birthday |
---|---|---|
10000000 | 藤原道長 | 1980-09-02 |
10000001 | 紫式部 | 2021-09-02 |
読み込み
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のカラム情報とファイル名を、「%SQL.Util.Procedures.cls」のプロシージャ「CSV」に渡すだけなので、かなり簡単にCSVファイルの取得ができます。
プロシージャの引数
先ほどは「第2引数=カラム情報」「第3引数=CSVファイル名」を引数としましたが、引数は他にもあります。
引数の説明です。
番号 | 名称 | 説明 |
---|---|---|
1 | selectMode | データ形式の定義(0:logical, 1:ODBC, 2:Display) ※指定してもあまり変わらないような・・・ |
2 | rowType | カラム情報。カラム名と型をカンマ区切りで設定する。 |
3 | fileName | ファイル名かストリームorefを渡す |
4 | delimiter | デリミタ。初期値はカンマ。TSVでは$c(9)を渡す。 |
5 | quote | 引用符文字。デフォルトは二重引用符。デフォルト値で十分。 |
6 | translateTable | エンコーディングの指定(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」
no | name | birthday |
---|---|---|
–no NUMERIC | name VARCHAR | birthday VARCHAR |
10000000 | 藤原道長 | 1980-09-02 |
10000001 | 紫式部 | 2021-09-02 |
おわりに
今まで、「CSVファイルなんて$pieceで十分だよ!」って力業で解決していましたが、こんな便利なプロシージャあるんですよね。
今後CSVファイルを読み込む機会があれば、超楽にPG組めちゃいますね!