【IRIS/Cache】テキストファイルに書く

今回は、テキストファイルへの書き込みの解説になります。

※この記事は下記の方向けになります。
  • テキストファイルへの書き方を知りたい
  • UTF-8にてBOMを付ける必要がある
  • テキストファイルに追記したい

はじめに

テキストファイルに書き込む方法はいくつかあります。
クラスを利用する方法(%Library.File.cls・%Stream.FileCharacter.cls等)や、openコマンドを利用する方法です。

今回は「%Stream.FileCharacter.cls」とopenコマンドについて解説します。

%Library.File.clsについては、下記を参照してください。

%Stream.FileCharacter.cls

簡単なサンプル

ClassMethod stmChar(filePath As %String, text As %String, charSet As %String = "UTF8")
{
	try {
		// メッセージの書き込み
		s file = ##class(%Stream.FileCharacter).%New()
		, file.Filename = filePath
		, file.TranslateTable = charSet

		d file.WriteLine(text)
		
		$$$ThrowOnError( file.%Save() )
	}catch e{
		w !,$system.Status.DisplayError(e.AsStatus())
	}
}

【コマンド実行】
s filePath = “D:\Temp\IRIS\streamCharacter.txt”
s text = “テスト入力”

d ##class(developer.text.Sample).stmChar(filePath, text)

やっている事は下記になります。

  1. %Stream.FileCharacter.clsをインスタンス化する
  2. file.Filenameに、ファイル名称をフルパスでセットする
  3. 文字コードをセットする(任意) ※他:SJIS等
  4. 書き込むテキストをfile.WriteLine()で書き出す。 ※file.Write()でもOK
  5. file.%Save()で登録する

※「file.WriteLine()」は、文字列の末尾に改行コード($char(13,10))が付与されます。

BOMを付与する

文字コードUTF-8でBOMを付与する場合は、プロパティ「BOM」に「$char(239, 187, 191)」をセットします。

文字コードが「UnicodeLittle(16ビット)・UnicodeBig(16ビット)」であれば、BOMが自動的に付与されます。

ClassMethod BOMtext(filePath As %String, text As %String)
{
	try {
		// メッセージの書き込み
		s file = ##class(%Stream.FileCharacter).%New()
		, file.Filename = filePath
		, file.TranslateTable = "UTF8"
		, file.BOM = $c(239,187,191)

		d file.WriteLine(text)
		
		$$$ThrowOnError( file.%Save() )
	}catch e{
		w !,$system.Status.DisplayError(e.AsStatus())
	}
}

追記する

ログ等は、1つのファイルに情報を追記していくタイプがあります。
「file.MoveToEnd()」を設定する事で、追記する事ができます。

ClassMethod addText(filePath As %String, text As %String, charSet As %String = "UTF8")
{
	try {
		// メッセージの書き込み
		s file = ##class(%Stream.FileCharacter).%New()
		, file.Filename = filePath
		, file.TranslateTable = charSet
		d file.MoveToEnd()

		d file.WriteLine(text)
		
		$$$ThrowOnError( file.%Save() )
	}catch e{
		w !,$system.Status.DisplayError(e.AsStatus())
	}
}

openコマンド

ややこいのは面倒って時は、openコマンドで簡単にテキストを書き込むことが可能です。
下記がサンプルになります。

ClassMethod openCmnd(fileName As %String, text As %String, charSet As %String = "UTF8")
{
	try {
		s flg = "WN_$s(charSet'="":"K\"_charSet_"\", 1:"")
		
		open fileName:(flg):5
		use fileName
		w text
		close fileName
	}catch e {
		w !,$System.Status.DisplayError(e.AsStatus())
	}
}

やっている事は実にシンプルで、開く・使う・書く・閉じるの4パターンです。

BOMを追加する

書き出しの前に、$char(239,187,191)を付ける!終わり!

追記する

Openコマンドにも追記モードがあります。
Nの新規ファイルに対し、Aは追記のパラメータになります。

ClassMethod openAddCmnd(fileName As %String, text As %String, charSet As %String = "UTF8")
{
	try {
		s flg = "WA"_$s(charSet'="":"K\"_charSet_"\", 1:"")		
		
		open fileName:(flg):5
		use fileName
		w text
		close fileName
	}catch e {
		w !,$System.Status.DisplayError(e.AsStatus())
	}
}

書き込みに関連するOpenパラメータを下記に記載します。
組み合わせて使用します。

文字コード説明
N新規ファイルの作成。既存ファイルがある場合は削除して作成する。
Eファイルが無い場合は作成する。既存ファイルは削除しない。
Dファイルと閉じたときファイルを削除する。
L排他ロック。
A追記モード。
Sストリームモード
K\[name]\文字変換モード。nameには「UTF8」や「SJIS」等を設定する。

おわりに

いかがだったでしょうか。

テキストを出力する機会は結構多いと思いますが、大体出力関数等を作成し、出力内容を引数に取る事が多いので、細かい仕様を忘れがちです。

そんな時は、この記事をみて思い出していただければ幸いです。