固定長ファイルのダウンロードとアップロード更新
最終更新日: 2021年12月14日
R8 | R9
ダウンロードするファイルからコンマを取り除き、固定長レコードに書き換えます。
"スクリプト>ヘルパ" タブの実行タイミング "ダウンロード(1件出力前)" にスクリプトを用意します。
このスクリプトは、ダウンロードファイルのタイプがCSV, TSVの場合にのみ実行されます。Excel(xls),Excel(xlsx)の場合は実行されません。
このスクリプトで利用できる暗黙変数は次の通りです。
通常のアップロード更新処理では、ファイルの各行をコンマ区切りの列に分解します。
この処理を開発者がカスタマイズするポイントが用意されています。これにより入力された行(のデータ)の解釈を変えることができます。
"スクリプト>ヘルパ" タブの実行タイミング "アップロード更新(1件読み込み前)" にスクリプトを用意します。
このスクリプトで利用できる暗黙変数は次の通りです。
ここでは、アップロードされるファイルの各行を固定長レコードとみなし、レコードをコンマ区切りの列に分解したあとで、Wagbyのアップロード更新処理に渡す例を示します。
上の説明では固定長ファイルを扱いましたが、標準の動作は次のようになっています。
ダウンロード
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'となる。
アップロード更新
利用できる暗黙変数
変数名
説明
istream
1レコードを読み込むために用意されている。この実体はjava.io.BufferedInputStreamクラスのインスタンス。istreamを使う場合、readerは使わないこと。
reader
読み込むファイルのReader。この実体はjava.io.BufferedReaderクラスのインスタンス。readerを使う場合、istreamは使わないこと。
UPLOADFILENAME
アップロードファイル名。
UPLOADFILEPATH
実際に一時フォルダに配置された物理ファイルのパス。UPLODAFILENAMEとは異なり、内部で用いる一時的なファイルとなっている。
// 固定長のバイトサイズ。開発者が適切な値を指定すること。
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);
標準の動作
// 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;
}
}