TSV文字列, 日付フィルタ

TSV文字列, 日付フィルタ
TSV文字列, 日付フィルタ (TSV String, Filter by Date)

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

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

Configs
  • A: TSV文字列が格納されている文字列型データ項目を選択してください *
  • B-target: フィルタが適用される数値列のカラムIDをセットしてください (例 “0” ) * #{EL}
  • B-range: 日付フィルタの範囲をセットしてください (例 “2010-01-01<2010-01-31” ) * #{EL}
  • C: フィルタされたTSV文字列が格納される文字列型データ項目を選択してください (更新) *
Script
// (c) 2019, Questetra, Inc. (the MIT License)
// Notes:
// Supported date format is "YYYY-MM-DD".
// For "AND search", try to place this Automated Step serially.
// Equals at range boundary values are included in the filter range.
//  (No Problem "2019-10-05<2019-10-05")
//
// Notes(ja):
// 対応する日付フォーマットは "YYYY-MM-DD" です
// "AND検索" は自動工程の直列配置をお試しください
// 範囲境界値におけるイコールはフィルタ範囲に含まれます
// (問題のないフィルタ例 "2019-10-05<2019-10-05")

//////// 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 / 演算 ==
// BPMS Date Format
const regBpmsYMD = /^\d{4}-\d{2}-\d{2}$/;

// 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" );
  }
  if( ! regBpmsYMD.test( arrRangeMinMax[0] ) ){
    throw new Error( "\n AutomatedTask ConfigError:" +
                     " Config DateRangeFr Format Error \n" );
  }
  if( ! regBpmsYMD.test( arrRangeMinMax[1] ) ){
    throw new Error( "\n AutomatedTask ConfigError:" +
                     " Config DateRangeTo Format Error \n" );
  }
  let arrDatePartsFr = arrRangeMinMax[0].split("-");
  let arrDatePartsTo = arrRangeMinMax[1].split("-");
  let dateFrom = new Date( arrDatePartsFr[0], arrDatePartsFr[1] - 1, arrDatePartsFr[2] );
  let dateTo   = new Date( arrDatePartsTo[0], arrDatePartsTo[1] - 1, arrDatePartsTo[2] );
  // "Note: TimeZoneOffset has been added"

  if( dateFrom > dateTo ){
    throw new Error( "\n AutomatedTask ConfigError:" +
                     " {Range Fileter} must be Ascending Order: " + 
                     arrRangeFilters[i] + " \n" );
  }
  arrFilterFromTo.push( [ dateFrom, dateTo] );
}

// Target matches Filter or not
let outputString = "";
for( let i = 0; i < arrInputString.length; i++ ){
  let arrTsvLine     = arrInputString[i].split("\t");
  if( ! regBpmsYMD.test( arrTsvLine[ numTargetColId ] ) ){ continue; }
  let arrTargetValue  = arrTsvLine[ numTargetColId ].split("-");
  let dateTargetValue = new Date( arrTargetValue[0], arrTargetValue[1] - 1, arrTargetValue[2] );
  // "Note: TimeZoneOffset has been added"

  for( let j = 0; j < arrFilterFromTo.length; j++ ){
    if( arrFilterFromTo[j][0] <= dateTargetValue && dateTargetValue <= 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 指定したい場合は "2020-01-01<2020-01-07,2020-01-21<2020-01-27" のようにカンマ区切りで指定します。

Notes

  1. 対応する日付フォーマットは “YYYY-MM-DD” です
  2. “AND検索” は自動工程の直列配置をお試しください
  3. 範囲境界値におけるイコールはフィルタ範囲に含まれます
    1. (問題のないフィルタ例 “2019-10-05<2019-10-05″)

See also

コメントを残す

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

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