固定長ファイルのダウンロードとアップロード更新

最終更新日: 2021年12月14日
R8 | R9

ダウンロード

ダウンロードするファイルからコンマを取り除き、固定長レコードに書き換えます。 "スクリプト>ヘルパ" タブの実行タイミング "ダウンロード(1件出力前)" にスクリプトを用意します。

このスクリプトは、ダウンロードファイルのタイプがCSV, TSVの場合にのみ実行されます。Excel(xls),Excel(xlsx)の場合は実行されません。

function process() {// 注意:宣言部が必要
  // data は、もともと、出力しようとしていたデータが格納された変数。
  // 以下のコードはデバッグ用。
  /*
  for (var i=0; i<data.length; i++) {
    print(data[i]);
  }
  */
  // 固定長のバイトサイズ。開発者が適切な値を指定すること。
  var ColumnSize = [
    6, 8, 8, 8, 8, 8
  ];
  if (data.length != ColumnSize.length) {// 個数があわない場合はエラーとする。
    //print("Illegal size " + data.length);
    return;
  }
  var recordsize = 0;
  for (var i=0; i<ColumnSize.length; i++) {
    recordsize += ColumnSize[i];
  }
  recordsize = recordsize + 2; // リターンコード(CRLF)のため2バイト多く確保する。
  var ByteArray = Java.type("byte[]");
  var bdata = new ByteArray(recordsize);
  var cnt = 0;
  for (var i=0; i<ColumnSize.length; i++) {
    var bdata1 = 
      Packages.jp.jasminesoft.util.ExcelFunction.STR2BYTEA(
        data[i], "MS932", ColumnSize[i], 0x20); // 0x20 はスペース文字。
    java.lang.System.arraycopy(bdata1, 0, bdata, cnt, ColumnSize[i]);
    cnt += ColumnSize[i];
  }
  bdata[cnt++] = 0xd; // CR
  bdata[cnt++] = 0xa; // LF
  ostream.write(bdata);
}
function getWriteType() {
  return "OutputStream";
}

利用できる暗黙変数

このスクリプトで利用できる暗黙変数は次の通りです。

変数名 説明
ostream バイト配列を出力するために用意されている。この実体はjava.io.BufferedOutputStreamクラスのインスタンス。
csvencoding CSVファイルの文字エンコーディング。
sepChar 列の区切り文字。デフォルトはコンマ(,)やタブ(\t)
repChar 列をくくる文字。デフォルトはダブルクォーテーション(")。Designerの設定「カラムのくくり文字」にて「(なし)」に変更できる。この場合は'\\u0000'となる。

アップロード更新

通常のアップロード更新処理では、ファイルの各行をコンマ区切りの列に分解します。 この処理を開発者がカスタマイズするポイントが用意されています。これにより入力された行(のデータ)の解釈を変えることができます。

"スクリプト>ヘルパ" タブの実行タイミング "アップロード更新(1件読み込み前)" にスクリプトを用意します。

このスクリプトは、アップロードファイルがCSV,TSVファイル(もしくはZIPファイルの場合、展開後に含まれるCSV,TSVファイル)の処理中に実行されます。Excel(xls),Excel(xlsx)の場合は実行されません。

利用できる暗黙変数

このスクリプトで利用できる暗黙変数は次の通りです。

変数名 説明
istream 1レコードを読み込むために用意されている。この実体はjava.io.BufferedInputStreamクラスのインスタンス。istreamを使う場合、readerは使わないこと。
reader 読み込むファイルのReader。この実体はjava.io.BufferedReaderクラスのインスタンス。readerを使う場合、istreamは使わないこと。
UPLOADFILENAME アップロードファイル名。
UPLOADFILEPATH 実際に一時フォルダに配置された物理ファイルのパス。UPLODAFILENAMEとは異なり、内部で用いる一時的なファイルとなっている。

ここでは、アップロードされるファイルの各行を固定長レコードとみなし、レコードをコンマ区切りの列に分解したあとで、Wagbyのアップロード更新処理に渡す例を示します。

  // 固定長のバイトサイズ。開発者が適切な値を指定すること。
  var ColumnSize = [
    6, 8, 8, 8, 8, 8
  ];
  var recordsize = 0;
  for (var i=0; i<ColumnSize.length; i++) {
    recordsize += ColumnSize[i];
  }
  recordsize = recordsize + 2; // リターンコード(CRLF)のため2バイト多く確保する。
  var ByteArray = Java.type("byte[]");
  var bdata = new ByteArray(recordsize);
  var readsize = istream.read(bdata);
  if (readsize == -1) {// End Of File の判定。
    return "EOF";
  }
  if (readsize <= 0) {// 読み込みエラーの可能性。
    return;
  }
  if (readsize != recordsize) {// 想定していない固定長レコードは無視する。
    return "Illegal record size " + readsize;
  }
  var StrArray = Java.type("java.lang.String[]");
  var data = new StrArray(ColumnSize.length);
  var cnt = 0;
  for (var i=0; i<ColumnSize.length; i++) {
    data[i] = new java.lang.String(bdata, cnt, ColumnSize[i], "MS932").trim();
    print(data[i]);//デバッグ用
    cnt += ColumnSize[i];
  }
  p.request.setAttribute("DbUploadUpdateRunnableMonitorFileProcessor_rowData", data);
  • この関数は process のみであるため(ダウンロードのスクリプトとは異なり)宣言部は省略できます。
  • ファイルを読み込むための暗黙変数 istream が利用できます。read メソッドを使って読み込んでください。
  • 読み込んだ値を data という配列に格納し、DbUploadUpdateRunnableMonitorFileProcessor_rowData というキー名で p.request にセットしてください。
  • このスクリプトが (return文で) 何らかの文字列を返したとき、その行の処理はエラーとなり、スキップされます。(アップロード更新処理自体は継続され、次の行の処理を行います。)

標準の動作

上の説明では固定長ファイルを扱いましたが、標準の動作は次のようになっています。

// reader の実体はjava.io.BufferedReaderクラスのインスタンス
var SEPCHAR = Packages.jp.jasminesoft.util.CSVUtil.DefaultSepChar;// "
var REPCHAR = Packages.jp.jasminesoft.util.CSVUtil.DefaultRepChar;// ,
try {
  var data = Packages.jp.jasminesoft.util.CSVUtil.parse(reader, REPCHAR, SEPCHAR, -1);
  p.request.setAttribute("DbUploadUpdateRunnableMonitorFileProcessor_rowData", data);
} catch (e) {
   if (e instanceof Packages.java.io.EOFException) {
     // End Of File.
   } else {
     throw e;
   }
}
  • CSVUtil クラスは Wagby フレームワークに同梱されているものです。parse メソッドで、入力された1行から分割された文字配列を返します。