$ps.file.readAllText
概要¶
サーバスクリプトで$ps.fileを使用してファイル読み込みをする際に使用します。ファイルの内容をすべて読み込み、文字列型で値を戻します。
前提条件¶
Script.jsonのDisableServerScriptFileを false に設定することが必要です。
構文¶
パラメータ¶
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
| section | string | ○ | セクション名。セクションについては$ps.fileの「セクションについて」を参照ください。 |
| path | string | ○ | ファイル名。ディレクトリの区切り文字はWindow、Linux共に「/」を利用する。 |
| encode | string | ファイルのエンコーディングの指定(※1)省略時は"utf-8" |
※1
System.Text.Encoding.GetEncoding のパラメータで指定できるコードページ名を指定します。
戻り値¶
ファイルの内容を文字列型で返却します。ファイルが存在しない場合はnullを返却します。
例外¶
C#内で例外が発生した場合はサーバスクリプト内に例外クラス名とエラーメッセージをErrorオブジェクトに入れて例外を発生させます。
使用例¶
以下の例では、Webサーバ内のファイルを読む込み、結果をログに出力します。
JavaScript¶
文字コード:Shift-JIS の例
let text = $ps.file.readAllText('01_develop', 'parts/01_parts.txt', 'shift-jis');
context.Log('text: ' + text);
サンプルコード¶
Note
コード内の【 ... 】は適宜修正してください。
1. 金融機関の振込結果ファイルを読み込み、支払明細を振込済み・振込エラーにする
振込結果取込のテーブルでプロセス「振込結果取込」を実行すると、金融機関から返された振込結果ファイル(Shift-JISの固定長)を$ps.file.readAllTextで読み込みます。行ごとの口座番号で支払明細を探し、結果に応じて「振込済み」または「振込エラー」にします。件数と、更新できなかった口座番号は、取込のレコードに残します。
実務での使いどころ¶
振込を実行したあと、金融機関から返る結果ファイルで成功・失敗を消し込む業務に使えます。標準のインポートはCSVのみに対応していて、固定長のファイルは読めません。また、ファイルの値で既存のレコードを探し、状況とエラー内容のみを変える、という取り込みもできません。$ps.file.writeAllTextのサンプル(振込データの書き出し)と、同じ支払明細のテーブルを使います。
事前準備¶
1:Script.jsonのDisableServerScriptFileをfalseにし、ServerScriptFilePathを設定して、プリザンターを再起動してください($ps.fileの前提条件)。結果ファイルは、このフォルダの下のセクションtransfer_resultsに置きます。
2:「支払明細」テーブル(記録テーブル)で、以下を設定してください。項目はエディタに表示しておいてください。エディタに無い項目は、サーバスクリプトから書き込まれません。
| 項目コード | 内容 |
|---|---|
| 分類E(ClassE) | 口座番号(7桁)。結果ファイルとの突き合わせに使う |
| 状況(Status) | 「900,振込データ作成済み」「910,振込済み」「920,振込エラー」を含める |
| 説明A(DescriptionA) | エラー内容 |
3:「振込結果取込」テーブル(記録テーブル)で、以下を設定し、エディタに表示してください。
| 項目コード | 内容 |
|---|---|
| 分類A(ClassA) | 取り込むファイル名(半角英数字・_・-・.) |
| 状況(Status) | 「100,未実行」「900,取込済み」 |
| 数値A(NumA)・数値B(NumB)・数値C(NumC) | 振込済み・振込エラー・更新できなかった件数 |
| 説明A(DescriptionA) | 更新できなかった口座番号 |
プロセス「振込結果取込」(現在の状況:未実行、変更後の状況:取込済み、アクション種別:保存)を作成してください。
4:「振込結果取込」テーブルにサーバスクリプトを登録します。
4-1:「テーブルの管理 > サーバスクリプト」タブで「新規作成」を選択する。
4-2:タイトル: 任意の名前(例:readTransferResultFile)
4-3:スクリプト: 下記サンプルコードを貼り付け
4-4:条件: 「更新前」にチェック
JavaScript¶
// 支払明細のサイトID
const DETAIL_SITE_ID = 【支払明細のサイトID】;
// 状況の値
const IMPORT_DONE = 900; // 振込結果取込:取込済み
const DETAIL_EXPORTED = 900; // 支払明細:振込データ作成済み(取り込む対象)
const DETAIL_PAID = 910; // 支払明細:振込済み
const DETAIL_FAILED = 920; // 支払明細:振込エラー
// 結果ファイルを置くセクション(Script.json の ServerScriptFilePath の下のフォルダ)と文字コード
const SECTION = 'transfer_results';
const ENCODING = 'shift-jis';
// 振込データ作成済みの明細から、口座番号(ClassE)が一致するものを取得する
function findDetails(account) {
// 分類項目の絞り込みは、配列形式+ExactMatchMultipleでないと完全一致にならない
const view = {
View: {
ColumnFilterHash: { ClassE: `["${account}"]`, Status: `["${DETAIL_EXPORTED}"]` },
ColumnFilterSearchTypes: { ClassE: 'ExactMatchMultiple' },
},
};
return Array.from(items.Get(DETAIL_SITE_ID, JSON.stringify(view)));
}
// プロセス「振込結果取込」で、状況が「取込済み」に変わる更新のときに、結果ファイルを読み込む
function readTransferResultFile() {
// saved は更新前の値。取込済みのレコードを保存し直したときは何もしない
if (model.Status !== IMPORT_DONE || Number(saved.Status) === IMPORT_DONE) {
return;
}
// ファイル名は、このレコードの分類A に入力しておく。ファイルが無いときは null が返る
const text = $ps.file.readAllText(SECTION, model.ClassA, ENCODING);
if (text === null) {
context.Error(`結果ファイル(${model.ClassA})が見つかりません。`);
return;
}
let paid = 0;
let failed = 0;
const notFound = [];
// 1文字目が D の行(データ)のみ読む。2〜8桁目が口座番号、9桁目が結果(1:成功、9:失敗)、10桁目以降がエラー内容
for (const line of text.split(/\r?\n/).filter((l) => l.startsWith('D'))) {
const account = line.substring(1, 8);
const details = findDetails(account);
// 口座番号で1件に決まらない行は、更新せずに残す
if (details.length !== 1) {
notFound.push(`${account}(${details.length}件)`);
continue;
}
const detail = details[0];
if (line.charAt(8) === '1') {
detail.Status = DETAIL_PAID;
paid++;
} else {
detail.Status = DETAIL_FAILED;
detail.DescriptionA = line.substring(9).trim();
failed++;
}
detail.Update();
}
// 件数と、更新できなかった口座番号をこのレコードに残す
model.NumA = paid;
model.NumB = failed;
model.NumC = notFound.length;
model.DescriptionA = notFound.join('\n');
}
readTransferResultFile();
結果ファイルの例(transfer_results/result_0925.txt)¶
1文字目が行の種類で、D(データ)の行のみ読みます。2〜8桁目が口座番号、9桁目が結果(1:成功、9:失敗)、10桁目以降がエラー内容です。
注記¶
readAllTextの3つ目の引数で文字コードを指定します(省略時はUTF-8)。ファイルが無いときはnullが返ります。このサンプルではcontext.Errorで止め、取込のレコードは未実行のままにします。- 振込データ作成済みの明細のみから探し、口座番号で1件に決まらない行は更新しません。取込のレコードの説明Aに「口座番号(件数)」で残ります。
- 状況が「取込済み」に変わる更新のときのみ読み込みます。取込済みのレコードを保存し直しても、もう一度は読みません。
- 取り込みのきっかけを、支払明細とは別のテーブルにしています。取込のレコードを、いつどのファイルを取り込んだかの履歴として残せます。
対応バージョン¶
| 対応バージョン | 内容 |
|---|---|
| 1.4.12.0 以降 | 機能追加 |
