TSV文字列, 数字ソート

TSV文字列, 数字ソート (TSV String, Sort by Numeric)

指定カラムの数値順でTSVテキストを行ソートします。各カラム値が「123円」「1,234円」「12円」だった場合は、「12円を含む行」「123円を含む行」「1,234円を含む行」の順に並べ替えられます。

2019-12-03 (C) Questetra, Inc. (MIT License)
https://support.questetra.com/ja/addons/tsv-string-sort-by-numeric/

Configs
  • A: TSV文字列が格納されている文字列型データ項目を選択してください *
  • B-key: ソートターゲットとなるカラムIDをセットしてください (例 “0” “3,1” ) * #{EL}
  • B-order: 降順(DESC)もしくは昇順(ASC)をセットしてください ( デフォルト “DESC” ) #{EL}
  • C: ソートされたTSV文字列が格納される文字列型データ項目を選択してください (更新) *
Script
// (c) 2019, Questetra, Inc. (the MIT License)
// Notes:
// Numeric parsing depends on JavaScript parseFloat().
// If a "prefix" precedes a number, it will not be determined as a number. (eg "$ 100")
// The period "." is recognized as a decimal point.
// Assumes a digit separator and evaluates all numbers after removing all commas ",".
// If you want to specify multiple sort keys, use {Column ID} in CSV notation (eg "3,1,0")
// Notes(ja):
// 数値判定は JavaScript parseFloat() に依存します
// 数値の前に "接頭辞" があると数値として判定されません ( 例 "$100" )
// ピリオド "." は小数点として認識されます
// 桁区切り文字を想定し、全てのカンマ "," を除去したうえで数値判定します
// ソートキーを複数指定したい場合、{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( parseFloat(arrTsvlineA[ parseInt(arrTargetColIds[i]) ].replace( /,/g,"")) <
          parseFloat(arrTsvlineB[ parseInt(arrTargetColIds[i]) ].replace( /,/g,"")) ){ return 1; }
      if( parseFloat(arrTsvlineA[ parseInt(arrTargetColIds[i]) ].replace( /,/g,"")) >
          parseFloat(arrTsvlineB[ parseInt(arrTargetColIds[i]) ].replace( /,/g,"")) ){ 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( parseFloat(arrTsvlineA[ parseInt(arrTargetColIds[i]) ].replace( /,/g,"")) >
          parseFloat(arrTsvlineB[ parseInt(arrTargetColIds[i]) ].replace( /,/g,"")) ){ return 1; }
      if( parseFloat(arrTsvlineA[ parseInt(arrTargetColIds[i]) ].replace( /,/g,"")) <
          parseFloat(arrTsvlineB[ parseInt(arrTargetColIds[i]) ].replace( /,/g,"")) ){ return -1; }
    }
  }
  return 0;
});


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

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

Download

Capture

指定カラムの数値順でTSVテキストを行ソートします。各カラム値が「123円」「1,234円」「12円」だった場合は、「12円を含む行」「123円を含む行」「1,234円を含む行」の順に並べ替えられます。

Notes

  1. 数値判定は JavaScript parseFloat() に依存します
  2. 数値の前に “接頭辞” があると数値として判定されません ( 例 “$100” )
  3. ピリオド “.” を小数点として認識します
  4. 桁区切り文字を想定し、全てのカンマ “,” を除去したうえで数値判定します
  5. ソートキーを複数指定したい場合、{Column ID} をCSV表記で行います ( 例 “3,1,0” )

See also

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

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