TSV文字列, 数値フィルタ

TSV文字列, 数値フィルタ
TSV文字列, 数値フィルタ (TSV String, Filter by Numeric)

数値範囲を使ってTSV文字列をフィルタリングします。指定の数値カラムが数値範囲に含まれる行のみ出力されます。複数の範囲を OR 指定したい場合は “-100<36.4,37.5<100” のようにカンマ区切りで指定します。

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

Configs
  • A: TSV文字列が格納されている文字列型データ項目を選択してください *
  • B-target: フィルタが適用される数値列のカラムIDをセットしてください (例 “0” ) * #{EL}
  • B-range: 数値フィルタの範囲をセットしてください (例 “0<100” “-100<36.4,37.5<100” ) * #{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 infinity, specify "(-)Infinity". (eg. "-Infinity<36.4,37.5<Infinity")
// For "AND search", try to place this Automated Step serially.
// Equals at range boundary values are included. (No Problem "37.0<37.0")
//
// Notes(ja):
// 数値判定は JavaScript parseFloat() に依存します
// 数値の前に "接頭辞" があると数値として判定されません ( 例 "$100" )
// ピリオド "." は小数点として認識されます
// 桁区切り文字を想定し、全てのカンマ "," を除去したうえで数値判定します
// 無限大は "(-)Infinity" を指定します (例 "-Infinity<36.4,37.5<Infinity")
// "AND検索" は自動工程の直列配置をお試しください
// 範囲境界値はフィルタ範囲に含まれます (問題のない設定例 "37.0<37.0")

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

//// == Config Retrieving / 工程コンフィグの参照 ==
const dataIdA      = configs.get( "conf_DataIdA" ) + "";       // config required
const targetColId  = configs.get( "conf_TargetColId" ) + "";   // config required
const rangeFilters = configs.get( "conf_RangeFilters" ) + "";  // config required
const dataIdC      = configs.get( "conf_DataIdC" ) + "";       // config required
engine.log( " AutomatedTask Config: Target Column ID: " + targetColId );
engine.log( " AutomatedTask Config: Range Filters: " + rangeFilters );

if( targetColId === "" ){
  throw new Error( "\n AutomatedTask ConfigError:" +
                   " Config {Column ID} is empty \n" );
}
const numTargetColId = parseInt( targetColId );

if( rangeFilters === "" ){
  throw new Error( "\n AutomatedTask ConfigError:" +
                   " Config {Range Fileters} is empty \n" );
}
const arrRangeFilters = rangeFilters.split(",");


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


//// == Calculating / 演算 ==
// parse Filters
let arrFilterFromTo = [];
for( let i = 0; i < arrRangeFilters.length; i++ ){
  let arrRangeMinMax = arrRangeFilters[i].split("<");
  if( arrRangeMinMax.length !== 2 ){
    throw new Error( "\n AutomatedTask ConfigError:" +
                     " {Range Fileter} must have one '<': " + 
                     arrRangeFilters[i] + " \n" );
  }
  let numRangeMin = parseFloat( arrRangeMinMax[0] );
  let numRangeMax = parseFloat( arrRangeMinMax[1] );
  if( numRangeMin > numRangeMax ){
    throw new Error( "\n AutomatedTask ConfigError:" +
                     " {Range Fileter} must be Ascending Order: " + 
                     arrRangeFilters[i] + " \n" );
  }
  arrFilterFromTo.push( [ numRangeMin, numRangeMax] );
}

// Target matches Filter or not
let outputString = "";
for( let i = 0; i < arrInputString.length; i++ ){
  let arrTsvLine     = arrInputString[i].split("\t");
  let numTargetValue = parseFloat( arrTsvLine[ numTargetColId ].replace( /,/g,"") );
  if( isNaN(numTargetValue) ){ continue; }
  for( let j = 0; j < arrFilterFromTo.length; j++ ){
    if( arrFilterFromTo[j][0] <= numTargetValue &&
        numTargetValue <= arrFilterFromTo[j][1] ){
      outputString += arrInputString[i];
      outputString += "\n";
      break;
    }
  }
}
outputString = outputString.replace(/[\n]*$/, "");


//// == Data Updating / ワークフローデータへの代入 ==
if( outputString === "" ){
  engine.log( " AutomatedTask DataUpdating: Output Text empty" );
}
engine.setDataByNumber( dataIdC, outputString );

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

Download

Capture

数値範囲を使ってTSV文字列をフィルタリングします。指定の数値カラムが数値範囲に含まれる行のみ出力されます。複数の範囲を OR 指定したい場合は "-100<36.4,37.5<100" のようにカンマ区切りで指定します。

Notes

  1. 数値判定は JavaScript parseFloat() に依存します
  2. 数値の前に “接頭辞” があると数値として判定されません ( 例 “$100” )
  3. ピリオド “.” は小数点として認識されます
  4. 桁区切り文字を想定し、全てのカンマ “,” を除去したうえで数値判定します
  5. 無限大は “(-)Infinity” を指定します (例 “-Infinity<36.4,37.5<Infinity”)
  6. “AND検索” は自動工程の直列配置をお試しください
  7. 範囲境界値はフィルタ範囲に含まれます (問題のない設定例 “37.0<37.0″)

See also

コメントを残す

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

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