TSV 文字列, Keywords フィルタ
TSV String, Filter by Keywords
TSVテキストをカラムマッチ行だけに絞り込みます。マッチ条件には「と等しい」「を含む」「で始まる」「で終わる」のいずれかが指定できます。大文字小文字を区別しないフィルタも指定可能です。別途、除外された行(フィルタ除去行)を格納することも可能です。
Configs for this Auto Step
- StrConfA1
- A1: TSV テキストをセットしてください *#{EL}
- StrConfB0
- B0: マッチ判定が行われるカラムのIDをセットしてください (例: “0”) *#{EL}
- OptionConfB1
- B1: マッチ条件の演算子を選択してください *
- StrConfB2
- B2: マッチ条件の Keyword をセットしてください (複数行セットはOR検索) *#{EL}
- SelectConfC1
- C1: 絞り込まれたテキストが格納される文字列型データ項目を選択してください (更新)
- SelectConfC2
- C2: 除去された行が格納される文字列型データ項目を選択してください (更新)
Script (click to open)
// GraalJS Script (engine type: 2)
//////// START "main()" ////////////////////////////////////////////////////////////////
main();
function main(){
//// == Config Retrieving / 工程コンフィグの参照 ==
const strInput = configs.get ( "StrConfA1" ); /// REQUIRED
if( strInput === "" ){
throw new Error( "\n AutomatedTask ConfigError:" +
" Config {A1: String} is empty \n" );
}
const strColMatchId = configs.get ( "StrConfB0" ); /// REQUIRED
if( strColMatchId === "" ){
throw new Error( "\n AutomatedTask ConfigError:" +
" Config {B0: String} is empty \n" );
}
const strOperator = configs.get ( "OptionConfB1" ); /// REQUIRED (SELECT_ITEM)
// "equals", "conains", "stratswith", "endswith",
// "equals2", "conains2", "startswith2", "endswith2" (2:ignore case)
const strKeywords = configs.get ( "StrConfB2" ); /// REQUIRED
if( strKeywords === "" ){
throw new Error( "\n AutomatedTask ConfigError:" +
" Config {B2: String} is empty \n" );
}
const strPocketOutput = configs.getObject( "SelectConfC1" ); // NotRequired
const strPocketRemoved = configs.getObject( "SelectConfC2" ); // NotRequired
//// == Data Retrieving / ワークフローデータの参照 ==
// (Nothing. Retrieved via Expression Language in Config Retrieving)
//// == Calculating / 演算 ==
const numColMatchId = parseInt ( strColMatchId );
const arrInput = strInput.split( '\n' );
const arrKeywords = strKeywords.split( '\n' );
let arrOutput = [];
let arrRemoved = [];
if ( strOperator === "equals" ) {
loopInput:
for ( let i = 0; i < arrInput.length; i++ ) {
for ( let j = 0; j < arrKeywords.length; j++ ) {
if ( arrKeywords[j] === "" ){
engine.log( " AutomatedTask RuntimeWorning: Empty in Keywords config" );
continue;
}
if ( arrInput[i].split( '\t', (numColMatchId + 1) )?.[ numColMatchId ] ===
arrKeywords[j] ){
// optional chaining (?.) operator returns `undefined` instead of throwing an error.
// https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/Optional_chaining
arrOutput.push ( arrInput[i] );
continue loopInput;
}
}
arrRemoved.push ( arrInput[i] );
}
} else if ( strOperator === "equals2" ) {
loopInput:
for ( let i = 0; i < arrInput.length; i++ ) {
for ( let j = 0; j < arrKeywords.length; j++ ) {
if ( arrKeywords[j] === "" ){
engine.log( " AutomatedTask RuntimeWorning: Empty in Keywords config" );
continue;
}
if ( arrInput[i].split( '\t', (numColMatchId + 1) )?.[ numColMatchId ].toUpperCase() ===
arrKeywords[j].toUpperCase() ){
arrOutput.push ( arrInput[i] );
continue loopInput;
}
}
arrRemoved.push ( arrInput[i] );
}
} else if ( strOperator === "contains" ) {
loopInput:
for ( let i = 0; i < arrInput.length; i++ ) {
for ( let j = 0; j < arrKeywords.length; j++ ) {
if ( arrKeywords[j] === "" ){
engine.log( " AutomatedTask RuntimeWorning: Empty in Keywords config" );
continue;
}
if ( arrInput[i].split( '\t', (numColMatchId + 1) )?.[ numColMatchId ]
.includes( arrKeywords[j] ) ){
arrOutput.push ( arrInput[i] );
continue loopInput;
}
}
arrRemoved.push ( arrInput[i] );
}
} else if ( strOperator === "contains2" ) {
loopInput:
for ( let i = 0; i < arrInput.length; i++ ) {
for ( let j = 0; j < arrKeywords.length; j++ ) {
if ( arrKeywords[j] === "" ){
engine.log( " AutomatedTask RuntimeWorning: Empty in Keywords config" );
continue;
}
if ( arrInput[i].split( '\t', (numColMatchId + 1) )?.[ numColMatchId ].toUpperCase()
.includes( (arrKeywords[j].toUpperCase()) ) ){
arrOutput.push ( arrInput[i] );
continue loopInput;
}
}
arrRemoved.push ( arrInput[i] );
}
} else if ( strOperator === "startswith" ) {
loopInput:
for ( let i = 0; i < arrInput.length; i++ ) {
for ( let j = 0; j < arrKeywords.length; j++ ) {
if ( arrKeywords[j] === "" ){
engine.log( " AutomatedTask RuntimeWorning: Empty in Keywords config" );
continue;
}
if ( arrInput[i].split( '\t', (numColMatchId + 1) )?.[ numColMatchId ]
.startsWith( arrKeywords[j] ) ){
arrOutput.push ( arrInput[i] );
continue loopInput;
}
}
arrRemoved.push ( arrInput[i] );
}
} else if ( strOperator === "startswith2" ) {
loopInput:
for ( let i = 0; i < arrInput.length; i++ ) {
for ( let j = 0; j < arrKeywords.length; j++ ) {
if ( arrKeywords[j] === "" ){
engine.log( " AutomatedTask RuntimeWorning: Empty in Keywords config" );
continue;
}
if ( arrInput[i].split( '\t', (numColMatchId + 1) )?.[ numColMatchId ].toUpperCase()
.startsWith( (arrKeywords[j].toUpperCase()) ) ){
arrOutput.push ( arrInput[i] );
continue loopInput;
}
}
arrRemoved.push ( arrInput[i] );
}
} else if ( strOperator === "endswith" ) {
loopInput:
for ( let i = 0; i < arrInput.length; i++ ) {
for ( let j = 0; j < arrKeywords.length; j++ ) {
if ( arrKeywords[j] === "" ){
engine.log( " AutomatedTask RuntimeWorning: Empty in Keywords config" );
continue;
}
if ( arrInput[i].split( '\t', (numColMatchId + 1) )?.[ numColMatchId ]
.endsWith( arrKeywords[j] ) ){
arrOutput.push ( arrInput[i] );
continue loopInput;
}
}
arrRemoved.push ( arrInput[i] );
}
} else if ( strOperator === "endswith2" ) {
loopInput:
for ( let i = 0; i < arrInput.length; i++ ) {
for ( let j = 0; j < arrKeywords.length; j++ ) {
if ( arrKeywords[j] === "" ){
engine.log( " AutomatedTask RuntimeWorning: Empty in Keywords config" );
continue;
}
if ( arrInput[i].split( '\t', (numColMatchId + 1) )?.[ numColMatchId ].toUpperCase()
.endsWith( (arrKeywords[j].toUpperCase()) ) ){
arrOutput.push ( arrInput[i] );
continue loopInput;
}
}
arrRemoved.push ( arrInput[i] );
}
} else {
throw new Error( "\n AutomatedTask RuntimeError:" +
" Unexpected OPERATOR \n" );
}
let strOutput = arrOutput?.join( '\n' ) ?? "";
let strRemoved = arrRemoved?.join( '\n' ) ?? "";
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining
//// == Data Updating / ワークフローデータへの代入 ==
if ( strPocketOutput !== null ) {
engine.setData ( strPocketOutput, strOutput );
}
if ( strPocketRemoved !== null ) {
engine.setData ( strPocketRemoved, strRemoved );
}
} //////// END "main()" /////////////////////////////////////////////////////////////////
/*
Notes:
- When a process reaches this automated step, "TSV text" is automatically processed.
- Column value in each line of TSV is compared to the Keyword, and only lines matching the condition are output.
- If "0" is specified for the column ID, the first value of each line and Keyword are compared.
- If "1" is specified for the column ID, the second value of each line and Keyword are compared.
- The match condition can be one of the following: "equals", "contains", "starts with", or "ends with".
- Note that it is possible to store not only filtered-down rows, but also filtered-out rows.
- In other words, "does not equal", "does not contain", "does not start with" and "does not end with".
- In case of OR search, set each Keyword separately in each line.
- OR search: "equals one of the Keywords", "contains one of", "starts with one of", "ends with one of"
- For example, if you want to extract rows containing "Tokyo" or "Kyoto"
- Set "Tokyo" on the first row and "Kyoto" on the second row. (OR-Search)
- For AND search, design a workflow diagram such as "Multiple automated steps" or "Place in loop structure".
- For example, if you want to extract rows containing "Kyoto" and "Spa" design the process in two steps.
- First, extract rows containing "Kyoto".
- Then, extract rows containing "Spa".
- You can automate the work process in various business processes (workflow).
- Confirm registration of product master
- Confirm registration of e-mail address list
- Extract only specific header information from mail headers
- Extract only specific city addresses from a customer address list
- Extract only the current week's records from server logs on a regular basis
- Extract only the current month's log from attendance logs or absence logs on a regular basis
Appendix-en:
- In the Keyword setting field, blank lines (blank character settings) are skipped.
- There is no way to match (extract) only blank lines.
- In other words, blank lines are always filtered out.
- If you want to remove blank lines in advance:
- Use "Multiline String, Delete Empty Lines"
- If the amount of calculation is too large, the process will be terminated in the middle.
- A large number of Lines and Keywords that requires more than 30 secs will result in a termination.
- No line feed code is inserted at the end of the output string.
- "Narrowed Text" (filtered down)
- "Removed Lines" (filtered out)
- Old Versions
- TSV String, Filter by Text
- https://support.questetra.com/ja/addons/tsv-string-filter-by-text-2021/
- TSV String, Filter Out by Text
- https://support.questetra.com/ja/addons/tsv-string-filter-out-by-text-2021/
Notes-ja:
- 案件がこの自動工程に到達した際、「TSVテキスト」が自動的に加工さます。
- TSVテキスト各行の指定カラムがそれぞれ Keyword と比較され、条件にマッチした行だけが出力されます。
- カラムIDに「0」が指定された場合、各行の先頭値と Keyword が比較されます。
- カラムIDに「1」が指定された場合、各行の2番目の値と Keyword が比較されます。
- マッチ条件には「Keyword と等しい」「を含む」「で始まる」「で終わる」のいずれかを指定します。
- なお、フィルタ抽出された行だけでなく、フィルタ除去された行を格納することも可能です。
- 言い換えれば「と等しくない」「を含まない」「で始まらない」「で終わらない」の抽出も可能です。
- OR 検索の場合は、それぞれの Keyword を各行に分けて設定してください。
- OR 検索:「Keywords のいずれかと等しい」「のいずれかを含む」「のいずれかで始まる」「のいずれかで終わる」
- たとえば「東京都」もしくは「京都府」を「含む行」を抽出したい場合は、
- 「東京都」を1行目に、「京都府」を2行目に設定してください。(OR-Search)
- なお AND 検索は、「自動工程を複数配置」や「ループ構造内に配置」といったワークフロー図を設計してください。
- たとえば「京都府」かつ「銭湯」を含む行を抽出したい場合は、2段階で処理されるように設計してください。
- まず「京都府」を含む行を抽出する
- さらに「銭湯」を含む行を抽出する
- 様々な業務プロセス(ワークフロー)で、作業工程を自動化(無人化)できます。
- 商品マスターの登録を確認する
- メールアドレスリストの登録を確認する
- メールヘッダから特定のヘッダ情報だけを抽出する
- 顧客住所リストから特定都市の住所だけを抽出する
- サーバーログから当週レコードだけを定時抽出する
- 出退勤ログや欠勤申請ログから当月ログだけを定時抽出する
Appendix-ja:
- Keyword 設定欄に "空行" があった場合、無視されます。
- "空行" だけにマッチさせる設定方法(空行だけを抽出する設定方法)はありません。
- 言い換えれば、"空行" は必ずフィルタ除去されます。
- あらかじめ "空行" を除去しておきたい場合:
- 『複数行文字列, 空行の削除』
- 計算量が多すぎる場合、途中終了します。
- 行数が多い・Keywordが多いなど、30秒を超えるような処理は途中で終了する可能性があります。
- 出力文字列の末尾に改行コードは挿入されません。
- "絞り込まれたテキスト"
- "除去された行"
- 以前のバージョン
- TSV文字列, テキストフィルタ
- https://support.questetra.com/ja/addons/tsv-string-filter-by-text-2021/
- TSV文字列, 除外テキストフィルタ
- https://support.questetra.com/ja/addons/tsv-string-filter-out-by-text-2021/
Test Data for Debug:
"Process ID" "Start User ID" "勤務日" "出勤時刻" "退勤時刻"
1977470 458 "2023-01-13" "2023-01-13 09:00" "2023-01-13 18:00"
1977469 456 "2023-01-13" "2023-01-13 09:00" "2023-01-13 19:00"
1977468 14 "2023-01-13" "2023-01-13 08:17" "2023-01-13 18:05"
1977467 15 "2023-01-13" "2023-01-13 09:00" "2023-01-13 18:00"
1977466 16 "2023-01-13" "2023-01-13 09:00" "2023-01-13 17:00"
1977465 92 "2023-01-13" "2023-01-13 09:00" "2023-01-13 17:00"
1977462 89 "2023-01-13" "2023-01-13 09:00" "2023-01-13 18:00"
1977459 88 "2023-01-13" "2023-01-13 09:00" "2023-01-13 18:30"
1977451 85 "2023-01-13" "2023-01-13 09:00" "2023-01-13 17:00"
1976698 15 "2023-01-11" "2023-01-11 09:00" "2023-01-11 18:30"
1976697 15 "2023-01-10" "2023-01-10 09:00" "2023-01-10 19:00"
1976610 458 "2023-01-12" "2023-01-12 09:00" "2023-01-12 18:00"
1976609 456 "2023-01-12" "2023-01-12 09:00" "2023-01-12 19:00"
1976608 14 "2023-01-12" "2023-01-12 08:16" "2023-01-12 18:06"
1976607 15 "2023-01-12" "2023-01-12 09:00" "2023-01-12 19:00"
1976606 16 "2023-01-12" "2023-01-12 09:00" "2023-01-12 17:00"
1976601 89 "2023-01-12" "2023-01-12 09:00" "2023-01-12 18:00"
1976598 88 "2023-01-12" "2023-01-12 09:00" "2023-01-12 18:30"
1976589 85 "2023-01-12" "2023-01-12 09:00" "2023-01-12 17:00"
1975830 89 "2023-01-10" "2023-01-10 09:00" "2023-01-10 18:30"
*/
Download
- tsv-string-filter-by-keywords-2023.xml
- 2023-01-20 (C) Questetra, Inc. (MIT License)
(アドオン自動工程のインストールは Professional editionでのみ可能です)
Notes
- 案件がこの自動工程に到達した際、「TSVテキスト」が自動的に加工さます。
- TSVテキスト各行の指定カラムがそれぞれ Keyword と比較され、条件にマッチした行だけが出力されます。
- カラムIDに「0」が指定された場合、各行の先頭値と Keyword が比較されます。
- カラムIDに「1」が指定された場合、各行の2番目の値と Keyword が比較されます。
- マッチ条件には「Keyword と等しい」「を含む」「で始まる」「で終わる」のいずれかを指定します。
- なお、フィルタ抽出された行だけでなく、フィルタ除去された行を格納することも可能です。
- 言い換えれば「と等しくない」「を含まない」「で始まらない」「で終わらない」の抽出も可能です。
- TSVテキスト各行の指定カラムがそれぞれ Keyword と比較され、条件にマッチした行だけが出力されます。
- OR 検索の場合は、それぞれの Keyword を各行に分けて設定してください。
- OR 検索「Keywords のいずれかと等しい」「のいずれかを含む」「のいずれかで始まる」「のいずれかで終わる」
- たとえば「東京都」もしくは「京都府」を「含む行」を抽出したい場合は、
- 「東京都」を1行目に、「京都府」を2行目に設定してください。(OR-Search)
- なお AND 検索は、「自動工程を複数配置」や「ループ構造内に配置」といったワークフロー図を設計してください。
- たとえば「京都府」かつ「銭湯」を含む行を抽出したい場合は、2段階で処理されるように設計してください。
- まず「京都府」を含む行を抽出する
- さらに「銭湯」を含む行を抽出する
- たとえば「京都府」かつ「銭湯」を含む行を抽出したい場合は、2段階で処理されるように設計してください。
- 様々な業務プロセス(ワークフロー)で、作業工程を自動化(無人化)できます。
- 商品マスターの登録を確認する
- メールアドレスリストの登録を確認する
- メールヘッダから特定のヘッダ情報だけを抽出する
- 顧客住所リストから特定都市の住所だけを抽出する
- サーバーログから当週レコードだけを定時抽出する
- 出退勤ログや欠勤申請ログから当月ログだけを定時抽出する
Capture


Appendix
- Keyword 設定欄に “空行” があった場合、無視されます。
- “空行” だけにマッチさせる設定方法(空行だけを抽出する設定方法)はありません。
- 言い換えれば、”空行” は必ずフィルタ除去されます。
- あらかじめ “空行” を除去しておきたい場合:
- 『複数行文字列, 空行の削除』
- “空行” だけにマッチさせる設定方法(空行だけを抽出する設定方法)はありません。
- 計算量が多すぎる場合、途中終了します。
- 行数が多い・Keywordが多いなど、30秒を超えるような処理は途中で終了する可能性があります。
- 出力文字列の末尾に改行コードは挿入されません。
- “絞り込まれたテキスト”
- “除去された行”
- 以前のバージョン
- TSV文字列, テキストフィルタ
- TSV文字列, 除外テキストフィルタ