Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
いつもお世話になります
ロードスクリプトでデータ処理をしています。
コメント内に「特定のキーワード」が含まれる行だけを選別したいのですが
キーワードがそもそも1万個もあって
where コメント like '*キーワード*' で書いていられる数ではありません
wildmach(コメントフィールド,'*キーワード1*','*キーワード2*','*キーワード3*')での判別も
キーワードを横に書かないといけないようです
完全一致ならapplymap や inner joinなどで絞れるのですが
ワイルドカードでの一致の場合、みなさんはどのようになさってるでしょうか?
みなさん、ありがとうございます
自己レスです
(1)以下のキーワードテーブルをMapping LOAD
MAP_キーワード集: という名称で
キーワード項目,
'これはキーワードです’ as ヒットフラグ
(2)比較したいテーブルをロード
この時、MapSubString('MAP_キーワード集',比較部分) as 比較部分2,
とすると、キーワードがヒットした箇所が”これはキーワードです”という文字列で置換される
キーワードの大文字小文字も見てくれるので便利でした
(3)上記を再ロードするときに
where 比較部分2 like '*これはキーワードです*'
で絞れば、キーワードが含まれる文章のみを取り出すことができました。
本当は 素直に likeで キーワードを羅列出来れば、ロードスクリプトが認識しやすくて
保守性もいいんですが、likeの条件が100個くらいを超えたあたりで、正しく動かなくなる
というか無視されるようでした・・・・
このような感じでいかがでしょうか?
CriteriaTable:
LOAD * INLINE [
Criteria
*a*
*f*
];
TextTable:
LOAD * INLINE [
Text
abc
dhejk
sjkdi
hwujk
oiuep
nufjk
];
Outer Join LOAD Criteria Resident Criteria;
Result:
LOAD Text as SearchedText Resident Text Where Text like Criteria;
キーワードのテーブルを読み込んで、その内容をfor文で回して文字列変数に組み込んで
leikeの文のところかwildmatchに入れれば良いのでは?
例えば、
LOAD キーワード FROM キーワードテーブル;
for i=0 to fieldnumber(キーワード,キーワードテーブル)
let Keywaord = Keyword & chr(39) &'*' & キーワード & '*' & chr(39);
next i;
LOAD A FROM table where wildmatch($(Keyword));
頭の中で考えて、例文を記述したので書式や関数が間違ってるかもしれませんが
大体言おうとしていることは理解していただけるのでは?
アドバイスありがとうございます。確かにこのサンプルで出来ますね・・・ 何故出来るのか、ちょっと不思議ですが、すごいテクニックですね・・・・
ただ今回の場合、キーワードx元のデータが10兆レコードなんていう馬鹿でかいものになってしまい、outer join出来ませんでした。せっかくなのにすみません
みなさん、ありがとうございます
自己レスです
(1)以下のキーワードテーブルをMapping LOAD
MAP_キーワード集: という名称で
キーワード項目,
'これはキーワードです’ as ヒットフラグ
(2)比較したいテーブルをロード
この時、MapSubString('MAP_キーワード集',比較部分) as 比較部分2,
とすると、キーワードがヒットした箇所が”これはキーワードです”という文字列で置換される
キーワードの大文字小文字も見てくれるので便利でした
(3)上記を再ロードするときに
where 比較部分2 like '*これはキーワードです*'
で絞れば、キーワードが含まれる文章のみを取り出すことができました。
本当は 素直に likeで キーワードを羅列出来れば、ロードスクリプトが認識しやすくて
保守性もいいんですが、likeの条件が100個くらいを超えたあたりで、正しく動かなくなる
というか無視されるようでした・・・・