コモノExtendScript100本ノック

超初心者のDTPオペレーターが週にひとつスクリプトを書くブログ

061補遺.【Id】タブ区切りtxtを読み込んで一括検索置換2

分かったこと

前回の記事にUske_Sさんからコメントを頂きました!
色々と勉強になったのでまとめると、
- File.openDialog()の戻り値
キャンセルされた場合の返り値はnull。
つまり、ファイルがあるかどうかを確認するにはexistsプロパティを見ればOKだが、それ以前にダイアログがキャンセルされていないかどうかを判断する必要がある。
- File.open()した後は必ずFile.close()する
きちんとclose()で閉じないと、動作がおかしくなったりファイルが壊れる可能性がある。
- File.readln()メソッド
ファイルから1行分の文字列を読み込む。
1行ずつ処理が必要な場合、File.eofプロパティとwhile文の組み合わせで簡潔に書ける。

これを踏まえて、タブ区切りテキストを読み込むfileReadIn()関数を書きました。

挙動

1.あらかじめ以下のようなテキストデータを作成しておく
000$[タブ]012
000$[タブ]015
2.以下のように呼び出す

var arr = fileReadIn("find", "change");

3.テキストを要求されるので指定する
4.1行ずつ処理され、以下のような配列がつくられる

[{find: "000$", change: "012"}, 
 {find: "000$", change: "015"}]

やったね。

コード

function fileReadIn(value1/*string*/, value2/*string*/) {
    var tgtFile = File.openDialog("ファイルを選んでください", "*.txt");
    if (!tgtFile || !tgtFile.exists) {
      alert("中断しました");
      exit();
    }
    var res = [];
    var fileReadFlag;
    tgtFile.open("r");
    tgtFile.encoding = "UTF-8";

    try {
        while (!tgtFile.eof) {
            var ln = tgtFile.readln().split(/\t/);
            var item = {};
            item[value1]=ln[0];
            item[value2]=ln[1];
            res.push(item);
        }
        fileReadFlag = true;
    } catch (e) {
        alert(e);
        fileReadFlag = false;
    } finally {
        tgtFile.close()
    }
    if (!fileReadFlag || res.length === 0) {
        alert("ファイルを読み込めませんでした");
        exit();
    }
return res;
}

Uske_Sさん、ありがとうございました!

参考