CSVファイル、XMLファイルの読み込み記事を書いたので、今回は普通のテキストファイルを読み込み方について解説致します。
テキストファイルを読み込みたい方は、この記事を一読して頂けると幸いです。
はじめに
ファイルの読み込み方法は何点かあります。
今回は、一般的な「%File」と「%Stream.FileCharacter」を使った読み込み方を解説致します。
サンプルとして下記を用意しました(文字コード=Shift JIS)。
hogehoge
fuga
藤原道長 左大臣
紫式部 源氏物語作者
%Fileを使ったテキスト読み込み
テキストファイルを読み込む処理が、下記サンプルです。
「%File」をインスタンス化し、関数「Open」でファイルを開き、関数「ReadLine」で行毎に読み込んでいます。
関数「Open」では、”RU”を引数として渡しています。
R=Read, U=未定義の長さ
関数「ReadLine」では、ステータス「sc」と最終行フラグ「eol」をByRefで受け取っています。
※今回「eol」は未使用です。最終ライン時に「0」となります。
→Open時に「U」を付与しないと常に「0」です。
※行毎の文字数が多い場合は変数に入りきれない場合があります。
その際は、第1引数に文字数を引数にしてください。設定した文字数毎に受け取ります。
初期値 = 32,000文字
Class developer.text.Sample
{
ClassMethod file(filePath As %String)
{
try {
s file=##class(%File).%New(filePath)
d file.Open("RU")
while('file.AtEnd) {
s line = file.ReadLine(, .sc, .eol) $$$ThrowOnError(sc)
w !,line
}
}catch e {
w !,$system.Status.DisplayError(e.AsStatus())
}
}
}
では、読み込んでみましょう。
下記コマンドをターミナルから実行します。
d ##class(developer.text.Sample).file("D:\Temp\Sample.txt")
実行結果です。
問題なくテキストファイルが読み込めている事が分かります。
UTF-8のテキストを読み込む
Windowsでは、デフォルトの文字コードが「Shift-JIS」のため、特に引数を意識しなくてもメモ帳の日本語を読み取る事が可能です。
ただ、文字コードが「UTF-8」のテキストファイルも数多くあります。
そのようなテキストファイルは、当然読み込んでも文字化けを起こして、正確に日本語を読み取る事はできません。
そのため先ほどのPGを修正し、「UTF-8」も「Shif-JIS」も読み取れるようにしましょう。
関数「Open」に渡す引数を増やし、引数「strMode」に文字コードを入力するようにします。
Class developer.text.Sample
{
ClassMethod file(filePath As %String, strMode As %String = "SJIS")
{
try {
s file=##class(%File).%New(filePath)
d file.Open("RU:/IOTABLE="""_strMode_"""")
while('file.AtEnd) {
s line = file.ReadLine(, .sc, .eol) $$$ThrowOnError(sc)
w !,line
q:('eol)
}
}catch e {
w !,$system.Status.DisplayError(e.AsStatus())
}
}
}
では、読み込んでみましょう。
下記コマンドをターミナルから実行します。
d ##class(developer.text.Sample).file("D:\Temp\Sample.txt","UTF8")
結果は同じになるので割愛致します。
%Stream.FileCharacterを使った読み込み
「%File」とどちらを使用しても構いません。
stream形式でファイルを読み取り場合に利用します。
BOM
文字コード「Unicode」には、BOM付きとBOM無しの2種類のファイルが存在しています。
BOMが付いている事で、Unicodeである事・種類や符号化形式等が分かります。
UTF-8では、先頭3文字に「$char(239,187,191) [0xEF 0xBB 0xBF]」が付与されます。
テキストファイル読み込み
サンプルになります。
「%File」とは設定が異なるので注意が必要です。
インスタンス化したオブジェクトに対し、「TranslateTable」には文字コードを、「Filename」にファイルパスを渡します。
Class developer.text.Sample
{
ClassMethod stream(filePath As %String, strMode As %String = "SJIS")
{
try {
s stm = ##class(%Stream.FileCharacter).%New()
, stm.TranslateTable = strMode
, stm.Filename = filePath
while('stm.AtEnd){
s line = stm.ReadLine(, .sc, .eol, .term) $$$ThrowOnError(sc)
w !,line
}
}catch e {
w !,$system.Status.DisplayError(e.AsStatus())
}
}
}
では、読み込んでみましょう。
下記コマンドをターミナルから実行します。
d ##class(developer.text.Sample).stream("D:\Temp\Sample.txt","UTF8")
結果は変わらないので割愛します。
おわりに
テキストファイルは、読み込む機会がかなり多いと思います。
記述する方法を忘れてしまった場合は、この記事を再度確認していただければ助かります。