TSV文字列, テキストソート
TSV文字列, テキストソート (TSV String, Sort by Text)
指定カラムの文字コード順でTSVテキストを行ソートします。各行のカラム値が「Jan」「Feb」「March」だった場合は、「Febを含む行」「Janを含む行」「Marchを含む行」の順に並べ替えられます。
Configs
  • A: TSV文字列が格納されている文字列型データ項目を選択してください *
  • B-key: ソートターゲットとなるカラムIDをセットしてください (例 “0” “3,1” ) *#{EL}
  • B-order: 降順(DESC)もしくは昇順(ASC)をセットしてください ( デフォルト “DESC” )#{EL}
  • C: ソートされたTSV文字列が格納される文字列型データ項目を選択してください (更新) *
Script (click to open)
// GraalJS Script (engine type: 2)
// (c) 2021, Questetra, Inc. (the MIT License)
// Notes:
// If specifying multiple sort keys, use {Column ID} in CSV notation. (eg "3,1,0")
// Notes(ja):
// ソートキーを複数指定したい場合、{Column ID} をCSV表記で行います ( 例 "3,1,0" )



//////// START "main()" ////////////////////////////////////////////////////////////////
main();
function main(){ 

//// == Config Retrieving / 工程コンフィグの参照 ==
const dataIdA      = configs.get( "conf_DataIdA" ) + "";      // config required
const targetColIds = configs.get( "conf_TargetColIds" ) + ""; // config required
let   sortOrder    = configs.get( "conf_SortOrder" ) + "";    // config not required
const dataIdC      = configs.get( "conf_DataIdC" ) + "";      // config required
engine.log( " AutomatedTask Config: Sort Key Column(s): " + targetColIds );
engine.log( " AutomatedTask Config: Sort Order: " + sortOrder );

if( targetColIds === "" ){
  throw new Error( "\n AutomatedTask ConfigError:" +
                   " Config {Sort Column} is empty \n" );
}
const arrTargetColIds = targetColIds.split(",");

if( sortOrder !== "ASC" ){
  sortOrder = "DESC";
}


//// == Data Retrieving / ワークフローデータの参照 ==
const inputString = engine.findDataByNumber( dataIdA ) + "";
let   arrInputString = inputString.split("\n");
engine.log( " AutomatedTask MultilineString:" + 
            " TSV {A}, number of lines: " + arrInputString.length );


//// == Calculating / 演算 ==
arrInputString.sort( function( tsvlineA, tsvlineB ){
  let arrTsvlineA = tsvlineA.split("\t");
  let arrTsvlineB = tsvlineB.split("\t");

  if( sortOrder === "DESC" ){
    for( let i = 0; i < arrTargetColIds.length; i++ ){
      if( arrTsvlineA.length <= arrTargetColIds[i] ||
          arrTsvlineB.length <= arrTargetColIds[i] ){
        throw new Error( "\n AutomatedTask UnexpectedNumberError:" +
                         " Number {Sort Key ID} is larger than TSV length \n" );
      }
      if( arrTsvlineA[ parseInt(arrTargetColIds[i]) ] <
          arrTsvlineB[ parseInt(arrTargetColIds[i]) ] ){ return 1; }
      if( arrTsvlineA[ parseInt(arrTargetColIds[i]) ] >
          arrTsvlineB[ parseInt(arrTargetColIds[i]) ] ){ return -1; }
    }
  }else{ // ASC: alphabetical from A to Z
    for( let i = 0; i < arrTargetColIds.length; i++ ){
      if( arrTsvlineA.length <= arrTargetColIds[i] ||
          arrTsvlineB.length <= arrTargetColIds[i] ){
        throw new Error( "\n AutomatedTask UnexpectedNumberError:" +
                         " Number {Sort Key ID} is larger than TSV length \n" );
      }
      if( arrTsvlineA[ parseInt(arrTargetColIds[i]) ] >
          arrTsvlineB[ parseInt(arrTargetColIds[i]) ] ){ return 1; }
      if( arrTsvlineA[ parseInt(arrTargetColIds[i]) ] <
          arrTsvlineB[ parseInt(arrTargetColIds[i]) ] ){ return -1; }
    }
  }
  return 0;
});


//// == Data Updating / ワークフローデータへの代入 ==
engine.setDataByNumber( dataIdC, arrInputString.join("\n") );

} //////// END "main()" ////////////////////////////////////////////////////////////////

Download

Addonファイルのインポートは Professional でのみご利用いただけます

Notes

  1. ソートキーを複数指定したい場合、{Column ID} をCSV表記で行います ( 例 “3,1,0” )

Capture

指定カラムの文字コード順でTSVテキストを行ソートします。各行のカラム値が「Jan」「Feb」「March」だった場合は、「Febを含む行」「Janを含む行」「Marchを含む行」の順に並べ替えられます。

See also

%d人のブロガーが「いいね」をつけました。