ファイルに対する書き込みおよび読み取り
順次ファイルやコンマ区切り値 (CSV) ファイルなどのファイルに対する読み取りおよび書き込みは、その他のタイプのデータ・ソースにあるレコードの書き込みや読み取りと同様です。 ただし、データ・ソースへの接続プロセスが異なり、EGL データ・アクセス・ステートメントの特定のバリエーションに制限されます。
EGL では、いくつかのタイプのファイルについて書き込みおよび読み取りを行うことができます。これには、索引付きファイル、順次ファイル、およびコンマ区切り値 (CSV) ファイル (区切り文字ファイルと 呼ばれることもある) などが含まれます。これらのタイプのファイルは、主に、情報をファイルに 保存する点において異なりますが、ファイルの読み取りおよびファイルへの書き込みのプロセスは、 いずれのタイプも似ています。 このトピックでは、順次ファイルと CSV ファイルについて扱います。
前提条件
- EGL プロジェクト
リソース関連のセットアップ
ファイルに接続するには、そのファイルを指すリソース関連パーツを最初に定義しておく必要があります。 このファイルそのものは、ご使用のシステム上のファイルでも、データ・セットでも構いません。このサンプルでは、ローカル・ファイルを使用します。
- プロジェクトのビルド記述子を開きます。
- リソース関連パーツをビルド記述子に追加し、そのパーツをビルド・パーツ・エディターで開きます。 『EGL ビルド・ファイルへのリソース関連パーツの追加』を参照してください。
- 新規のリソース関連パーツにおいて、順次ファイルを配置する場所に、新規の関連を追加します。
- リソース関連パーツで、「関連の追加」ボタンをクリックします。 「関連要素」の下に、新規エントリーが表示されます。
- 新規エントリーの「ファイル名」フィールドに、EGL の命名要件に従って、順次ファイルのニーモニックを入力します (例: myFile)。このフィールドは、ディスク上の実際のファイルの名前ではありません。 このフィールドは、このファイルを使用するシリアル・レコード・パーツの fileName プロパティーの値に対応しています。
- 「システム」フィールドを、ご使用のシステムのタイプに設定します。 例: win (Windows の場合)、linux (Linux の場合)。
- 「ファイル・タイプ」フィールドを、順次レコードを表す seqws に設定します。
- 「systemName」フィールドを、そのファイルの完全修飾ロケーションに設定します。
例えば、Windows オペレーティング・システムでは、「systemName」を次のように設定する必要があります。
存在していないファイルを指示すると、そのファイルへの書き込み時に EGL がファイルを作成します。C:¥myFolder¥myFile.datリソース関連パーツで、各フィールドにユーザー独自の値を指定した場合は、次のようになります。

- リソース関連パーツを保存して、閉じます。
- resourceAssociations ビルド記述子オプションの値を、このリソース関連パーツの名前に設定します。
- ファイルに保存されるレコードを表すように、レコード・パーツを定義します。
例えば、順次ファイルを使用する場合は、以下のように serialRecord を定義します。
record mySerialRecord type serialRecord 10 myInteger int; 10 myChar char(50); end - 以下のように、fileName プロパティーを
、リソース関連パーツ・エントリーの「ファイル名」フィールドの値に設定します。
record mySerialRecord type serialRecord {fileName = "myFile"} 10 myInteger int; 10 myChar char(50); end
これで、このレコード・パーツをコード内で使用して、順次ファイルにアクセスできるようになりました。
リソース関連パーツについて詳しくは、「EGL 生成ガイド」を参照してください。
ファイルへの書き込み
ファイルへの書き込みは、その他のデータ・ソースへの書き込みと同様に行います。
- EGL プログラムまたはその他の論理パーツを開きます。
- ご使用のシリアル・レコード・パーツがスコープ内にあり、かつ順次ファイルに関連付けられていることを確認します (上記の『リソース関連のセットアップ』を参照)。
スコープ内に組み込むために、次のように import ステートメントを使用しなくてはならない場合があります。
import myProject.myData.mySerialRecord; - EGL プログラムで、ご使用のシリアル・レコードを基に、変数を宣言します。
variableRecord mySerialRecord; - 新規変数のフィールドに、データを追加します。
variableRecord.myInteger = 45; variableRecord.myChar = "Hello!"; - 適切な EGL データ・アクセス・ステートメント (例えば、add) を使用して、レコードをファイルに書き込みます。
add variableRecord; - プログラムを保存し、生成して、実行します。 順次ファイルの末尾に、新規レコードが書き込まれます。
ファイルからの読み取り
順次ファイルまたは CSV ファイルからのデータの読み取りは、その他のデータ・ソースからの読み取りと同様です。ただし、順序どおりにレコードを読み取る必要があります。
通常、シリアル・レコードを扱う際に、単一レコードを読み取る場合は get next ステートメントを、複数レコードを読み取る場合は get ステートメントを使用します。 このコンテキストでは、get next は、順次ファイルの先頭レコードから読み取りを開始し、順序に沿ってレコードを読み取ります。
- EGL プログラムまたはその他の論理パーツを開きます。
- 上記の『リソース関連のセットアップ』で説明されているように、ご使用のシリアル・レコード・パーツがスコープ内にあり、かつ順次ファイルに関連付けられていることを確認します。スコープ内に組み込むために、次のように import ステートメントを使用しなくてはならない場合があります。
import myProject.myData.mySerialRecord; - EGL 論理パーツで、ご使用のシリアル・レコードを基に、変数を宣言します。
variableRecord mySerialRecord; - その変数を使用して、順次ファイルからレコードを取り出します。
get next variableRecord; - 順次ファイルから取り出したデータを使用します。
sysLib.writeStderr(variableRecord.myChar); - プログラムを保存し、生成して、実行します。
このプログラムは、順次ファイルを読み取って、レコードのデータをコンソールで表示します。
Hello!
CSV ファイルの使用
123,yes,3/9/2007,Rahima
-1,no ,9/9/1999,Jorge
92,yes,,Ludmilla
この例は、データが 3 行で、それぞれの行に 4 つの情報部分があることを示しています。
情報の各部分は、区切り文字と呼ばれる文字で区切られています。この例ではコンマを使用しています。3 行目の 3 番目のデータ部分は、
区切り文字の間にデータがないことが示すように、ヌルである点に注意してください。
CSVRecord パーツは、これらの情報部分をそれぞれフィールドとして扱います。
このファイルの CSVRecord は、以下の例のようになります。record CsvRec type CSVRecord
{
fileName = "CSVFile",
delimiter = ",",
textQualifier = "¥"",
style = CsvStyle.quoted
}
jobCode int;
permStatus char(3);
hireDate date?;
firstName string;
end
fileName フィールドは、serialRecord と同じ目的を実行し、ファイルを指すリソース関連パーツの要素を参照します。 ただし
、CSVRecord にはいくつかの追加プロパティーがあります。
delimiter プロパティーは、情報の各部分を区切る文字を示します。この例ではコンマです。
textQualifier プロパティーと style プロパティーには密接な関係があります。この構成は、ストリングが予約文字を含んでいる場合は、
ファイルのストリングを引用符で囲むことができることを示しています。
詳しくは、CSVRecord ステレオタイプを参照してください。program readCSV type BasicProgram {}
oneRecord CsvRec;
function main()
//get the first record
get next oneRecord;
if (oneRecord is endOfFile)
//if there are no records
SysLib.writeStdout("This file is empty.");
else
while (oneRecord not endOfFile)
//perform this action for each record found
SysLib.writeStdout(oneRecord.firstName);
get next oneRecord;
end
end
end
end
このプログラムは、順次レコードを使用した前の例と同じ方法で、get next ステートメントを使用してファイルを読み取ります。
同じように、add ステートメントを使用して、CSV ファイルに書き込むことができます。