サポート > リポジトリ > CSV・Excel入出力 > 固定長ファイルのダウンロードとアップロード更新スクリプト

コンマ区切りではなく固定長レコードのファイルをダウンロードおよびアップロード更新する方法を説明します。8.3.1

ダウンロードするファイルからコンマを取り除き、固定長レコードに書き換えます。 "スクリプト>ヘルパ" タブの実行タイミング "ダウンロード(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'となる。

アップロードされるファイルの各行を固定長レコードとみなし、レコードをコンマ区切りの列に分解したあとで、Wagbyのアップロード更新処理に渡すようにします。 "スクリプト>ヘルパ" タブの実行タイミング "アップロード更新(1件読み込み前)" にスクリプトを用意します。

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

  // 固定長のバイトサイズ。開発者が適切な値を指定すること。
  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文で) 何らかの文字列を返したとき、その行の処理はエラーとなり、スキップされます。(アップロード更新処理自体は継続され、次の行の処理を行います。)

利用できる暗黙変数

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

変数名 説明
istream 1レコードを読み込むために用意されている。この実体はjava.io.BufferedInputStreamクラスのインスタンス。