2019年9月19日木曜日

連番付き変数のファイル入出力


連番付き変数をファイルに書き出し


%*script(%0\Script\SeqUserData2file.js,hoge)

とすると、連番付き変数(この例なら_User:hoge1 _User:hoge2 _User:hoge3 …)を一時ファイルに一行ずつ書き込み、そのパスを返す。また、

*script %0\Script\SeqUserData2file.js,hoge,%0fuga.txt

として、指定したファイル(この場合はfuga.txt)に書き込むこともできる。
連番付き変数の中身がファイルパスなら、

*ppc %*script(%0\Script\SeqUserData2file.js,hoge)

とすれば、お気に入りのように使うことができる。

 SeqUserData2file.js

//!*script
// 連番付き変数をファイルに保存。そのファイルのパスを返す

// テンポラリファイルに保存してそのパスを利用したい場合は
// %*script(%0\Script\SeqUserData2file.js,hoge) のように。特定のファイルに保存したい場合は
// *script %0\Script\SeqUserData2file.js,hoge,fuga.txt とする

// 第一引数 : ユーザデータ(_User:hoge1 _User:hoge2 _User:hoge3...のhoge)
// 第ニ引数 :保存先のファイルパス(省略可能。その場合はテンポラリファイルに保存)

// 引数がなければ終了
if (PPx.Arguments.Length < 1){
  PPx.SetPopLineMessage("引数が正しくありません。");
  PPx.Quit();
}

// テンポラリファイル名の作成
function getTempFile() {
  var fso = new ActiveXObject("Scripting.FileSystemObject");
  var tDir = fso.GetSpecialFolder(2);
  var tFile = fso.GetTempName();
  return tDir + "\\" + tFile;
}

var cmd = PPx.Arguments.Item(0);

var stream         = new ActiveXObject("ADODB.Stream");
    stream.type    = 2;
    stream.charset = 'UNICODE';

stream.open();
stream.WriteText(';ListFile',1);

// 登録済みパス一覧を表示
for (var i = 0; true; i++) {
  var str = PPx.Extract("%*getcust\(_User:"+cmd+i+"\)");
  if (str){
    stream.WriteText(str,1);
  } else {
    break;
  }
}

// 第ニ引数(保存先のファイルパス)があればそこに、なければテンポラリファイルに保存
var filepath;
if (PPx.Arguments.Length < 2){
  filepath = getTempFile();
} else {
  filepath = PPx.Arguments.Item(1);
}
stream.saveToFile(filepath,2);
stream.close();
PPx.Result = filepath;

連番付き変数をファイルから読み込み


 *script %0\Script\file2SeqUserData.js,hoge,%0fuga.txt

とすると、fuga.txtの内容を一行ずつ読み込み、連番付き変数(この例なら_User:hoge1 _User:hoge2 _User:hoge3 …)にセットする。

file2SeqUserData.js

//!*script
// テキストファイルの内容を連番付き変数にセットする
// 第一引数:ユーザーデータユーザデータ(_User:hoge1 _User:hoge2 _User:hoge3...のhoge)
// 第二引数:テキストファイルのパス
// *script %0\Script\file2SeqUserData.js,hoge,%0fuga.txt のようにして使う

// 引数がなければ終了
if (PPx.Arguments.Length < 2){
  PPx.SetPopLineMessage("引数が正しくありません。");
  PPx.Quit(-1);
}

var s = new ActiveXObject('ADODB.Stream');
var cmd = PPx.Arguments.Item(0);
var fn = PPx.Arguments.Item(1);

// エイリアスをリセット
for (var i = 0; i < 20; i++) {
  PPx.Execute("*setcust _User:-|"+cmd+i+" = ");
}

// ファイルを読み取り
s.type = 2;
s.charset = 'UNICODE';
s.open();
s.loadFromFile(fn);

var i = 0;

// エイリアスを順次セット
while(!s.EOS){
  line = s.readText(-2);
  if (line != "" && line != ";ListFile") {
    PPx.Execute("*setcust _User:"+cmd+i+" = "+line);
    i++;
  }
}
s.close();


0 件のコメント:

コメントを投稿