コンテンツにスキップ

$ps.file.readAllText

概要

サーバスクリプトで$ps.fileを使用してファイル読み込みをする際に使用します。ファイルの内容をすべて読み込み、文字列型で値を戻します。

前提条件

Script.jsonのDisableServerScriptFileを false に設定することが必要です。

構文

$ps.file.readAllText(section, path, encode=null);

パラメータ

パラメータ 型 必須 説明
section string ○ セクション名。セクションについては$ps.fileの「セクションについて」を参照ください。
path string ○ ファイル名。ディレクトリの区切り文字はWindow、Linux共に「/」を利用する。
encode string ファイルのエンコーディングの指定(※1)省略時は"utf-8"

※1
System.Text.Encoding.GetEncoding のパラメータで指定できるコードページ名を指定します。

戻り値

ファイルの内容を文字列型で返却します。ファイルが存在しない場合はnullを返却します。

例外

C#内で例外が発生した場合はサーバスクリプト内に例外クラス名とエラーメッセージをErrorオブジェクトに入れて例外を発生させます。

使用例

以下の例では、Webサーバ内のファイルを読む込み、結果をログに出力します。

JavaScript
let text = $ps.file.readAllText('01_develop', 'parts/01_parts.txt');
context.Log('text: ' + text);

文字コード: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)

H20260925
D12345671
D76543219残高不足
T2

1文字目が行の種類で、D(データ)の行のみ読みます。2〜8桁目が口座番号、9桁目が結果(1:成功、9:失敗)、10桁目以降がエラー内容です。

注記

  • readAllTextの3つ目の引数で文字コードを指定します(省略時はUTF-8)。ファイルが無いときはnullが返ります。このサンプルではcontext.Errorで止め、取込のレコードは未実行のままにします。
  • 振込データ作成済みの明細のみから探し、口座番号で1件に決まらない行は更新しません。取込のレコードの説明Aに「口座番号(件数)」で残ります。
  • 状況が「取込済み」に変わる更新のときのみ読み込みます。取込済みのレコードを保存し直しても、もう一度は読みません。
  • 取り込みのきっかけを、支払明細とは別のテーブルにしています。取込のレコードを、いつどのファイルを取り込んだかの履歴として残せます。

対応バージョン

対応バージョン 内容
1.4.12.0 以降 機能追加

関連情報