// GraalJS Script (engine type: 2)
//////// START "main()" /////////////////////////////////////////////////////////////////
main();
function main(){
//// == Config Retrieving / 工程コンフィグの参照 ==
const strTsv = configs.get( "StrConfA1" ); /// REQUIRED /////////////
if( strTsv === "" ){
throw new Error( "\n AutomatedTask ConfigError:" +
" Config {A1: Tsv} is empty \n" );
}
const arr2dTsv = parseAsRectangular( strTsv );
const strPocketOutput = configs.getObject( "SelectConfB1" ); /// REQUIRED ///////
const numPocketNumOfRows = configs.getObject( "SelectConfB2" ); // NotRequired /////
const numPocketNumOfColumns = configs.getObject( "SelectConfB3" ); // NotRequired /////
//// == Data Retrieving / ワークフローデータの参照 ==
// (Nothing. Retrieved via Expression Language in Config Retrieving)
//// == Calculating / 演算 ==
// output TSV
let strOutput = "";
for( let x = 0; x < arr2dTsv[0].length; x++ ){ // Will be Y in the new TSV
for( let y = 0; y < arr2dTsv.length; y++ ){ // Concatenate vertical data horizontally
strOutput += arr2dTsv[y][x];
if( y !== arr2dTsv.length - 1 ){
strOutput += "\t";
}
}
if( x !== arr2dTsv[0].length - 1 ){
strOutput += "\n";
}
}
//// == Data Updating / ワークフローデータへの代入 ==
engine.setData( strPocketOutput, strOutput );
if( numPocketNumOfRows !== null ){
engine.setData( numPocketNumOfRows, new java.math.BigDecimal( arr2dTsv[0].length ) );
}
if( numPocketNumOfColumns !== null ){
engine.setData( numPocketNumOfColumns, new java.math.BigDecimal( arr2dTsv.length ) );
}
} //////// END "main()" /////////////////////////////////////////////////////////////////
// Parses TSV string as two-dimensional rectangular data matrix and creates a 2D array.
function parseAsRectangular( strTsv ){
const arrTsv = strTsv.split("\n");
/// Get numMinWidth and numMaxWidth (blank lines are excluded)
let numMinWidth = Infinity; // cf. String-Type Max: 1 million
let numMaxWidth = 0;
let numBlanklines = 0;
for( let i = 0; i < arrTsv.length; i++ ){
if( arrTsv[i] === "" ){ // Skip blank lines
numBlanklines += 1;
continue;
}
let arrCells = arrTsv[i].split("\t");
if( numMinWidth > arrCells.length ){ numMinWidth = arrCells.length; }
if( numMaxWidth < arrCells.length ){ numMaxWidth = arrCells.length; }
}
engine.log( " AutomatedTask TsvDataCheck:" +
" MinWidth:" + numMinWidth +
" MaxWidth:" + numMaxWidth +
" Lines:" + arrTsv.length +
" (BlankLines:" + numBlanklines + ")" );
/// Get numMinWidth and numMaxWidth (blank lines are excluded)
let arr2dTsv = [];
for( let i = 0; i < arrTsv.length; i++ ){
if( arrTsv[i] === "" ){ // Skip blank lines
continue;
}
let arrTmp = [];
let arrCells = arrTsv[i].split("\t");
for( let j = 0; j < numMaxWidth; j++ ){
if( j < arrCells.length ){
arrTmp[j] = arrCells[j];
}else{
arrTmp[j] = "";
}
}
arr2dTsv.push( arrTmp );
}
return arr2dTsv;
}
/*
TSV Example:
2021-08 1,400
2021-09 2,500
2021-10 1,900
Notes:
- When the process reaches this automated task, TSV is automatically read.
- TSV: Sales Records, Survey Records, etc.
- If there is a blank line in the input TSV text, it will be skipped.
- The line feed code for the last line is not added either.
- The output TSV text (total table TSV, etc.) is rectangular data.
- The number of rows in TSV is the number of types of "aggregate Key".
- The number of columns of TSV is 3 of "key", "count" and "percentage"
APPENDIX:
- TSV (Tab Separated Values) text assumes rectangular data.
- The number of rows in the output TSV is the number of columns in the input TSV.
- The number of columns in the output TSV is the number of rows in the input TSV.
Notes-ja:
- 案件が自動処理工程に到達した際、文字列型データに保存されているTSVが自動的に読み込まれます。
- TSV: 売上レコード、アンケート回答ログ、など
- 入力TSVテキストに空行がある場合、スキップされます。
- 出力TSVの最終行に改行コードは付与されません。
- 出力されるTSVテキスト(合計値テーブルTSV等)は、矩形データです。
- 出力TSVの行数は、入力TSVの列数です。
- 出力TSVの列数は、入力TSVの行数です。
APPENDIX-ja:
- TSV(Tab Separated Values)テキストは、矩形データを前提とします。
- 矩形でないデータは、空文字によって自動整形されます。
- 空行(末尾改行を含む)は無視されます。
*/