SPSS ModelerのCLEM式でよく使う「文字列」関数

SPSS Modeler18.2.2で使用できるCLEM式の文字列関数についてまとめました。

# 文字列関数の分類と表記ルールについて
■　分類
CLEM式の文字列関数は、関数の実行結果から3つに分類できます。
文字列関数の実行結果が
１．文字列：String
２．文字の位置(何文字目)：Integer
３．真(1),偽(0)：Boolean

※SPSS Modelerにおける文字数のカウントは、全角半角を区別しません。
たとえば、全角の「アイウエオ」と半角の「ｱｲｳｴｵ」の全角の「ウ」と半角の「ｳ」は、どちらも文字の位置は3文字目です。全角半角の文字が混在していても文字単位でカウントします。

■　表記方法と説明
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/7b8bb112-d3ba-5056-12bc-a371a0fd9aa9.png)
■　ルール
CHAR:Character(文字)は、バッククォートで囲む
STRING:Strings(文字列)は、ダブルクォートで囲む

# １．結果を文字列で返す関数
○　文字列の最初や最後の空白文字を削除したい場合
空白文字には、全角スペース、半角スペース、タブが該当します。文字列の最初や最後にある複数の全角や半角スペース、全角スペース、半角スペースの混在なども一括で削除できます。
なお、一部の入力ノードには、フィールド内の文字列の前後のスペースを削除する機能があるのでそこで対応しておくと関数を使わずにすみます。

　・trimstart(STRING)：文字列フィールド(STRING)の最初の空白文字を削除
　・trimend(STRING)：文字列フィールド(STRING)の最後の空白文字を削除
　・trim(STRING)：文字列フィールド(STRING)の最初と最後の空白文字を削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/0fd1a9c5-0722-ce34-3122-58cc573bdca4.png)
文字列の最初や最後、その両方の空白文字が削除されました。
ただ文字列中内の空白文字は削除されないので次のような方法で対処します。

○　文字列を置換えたい場合
　・replace(SUBSTRING, NEWSUBSTRING, STRING)：文字列フィールド(STRING)の一部(SUBSTRING)を新しい文字列(NEWSUBSTRING)に置換

文字の置き換えでは、下の図のように全角・半角スペースを空に置き換えることで、文字列の前後、文字列中のスペースを削除することができます。ただし、タブは対象外です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/59432fd9-9329-f3d4-d8c2-5acb55a28840.png)
また、関数を入れ子にすればフィールド作成ノード1つで加工ができます。入れ子の表現は次の通りです。

replace(" ","",(replace("　","",コメント)))

○　文字列内の文字を削除したい場合
　・stripchar(CHAR,STRING)：文字列フィールド(STRING)から、指定した文字を削除

たとえば、これまでの例のように全角・半角スペースを削除するには、バッククォートで、それらを囲みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/cec9de33-f4f6-3269-ed27-995fd1766642.png)
　・allbutfirst(N, STRING)：文字列フィールド(STRING)の最初のN文字分を削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/4e5dd4ac-f86b-4c10-841f-5570eea56378.png)
コメントフィールドの最初の3文字を削除しました。

　・allbutlast(N, STRING)：文字列フィールド(STRING)の最後のN文字分を削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/7e9718da-2881-be23-76cd-05bea631428c.png)
コメントフィールドの最後の1文字を削除しました。

○　文字列の一部を抜粋したい場合
　・substring(N, LEN, STRING)：文字列フィールド(STRING)のN文字目から指定した文字数(LEN)を抜粋
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/d560e0b5-d343-328a-e7f2-d3e63346c00b.png)
コメントフィールドの2文字目から3文字を抜粋しました。

　・substring_between(N1, N2, STRING)：文字列フィールド(STRING)のN1文字目からN2文字目までを抜粋
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/1b4db119-5c24-ddf0-560e-e6f8b72b936d.png)
コメントフィールドの4文字目から7文字目までを抜粋しました。

　・startstring(LENGTH, STRING)：文字列フィールド(STRING)の1文字目から指定した文字数(LENGTH)を抜粋
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/940781a2-fbd3-0c0b-2964-0031a76fc2fd.png)
コメントフィールドの最初の3文字を抜粋しました。

　・endstring(LENGTH, STRING)：文字列フィールド(STRING)の最後の文字から指定した文字数(LENGTH)を抜粋
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/7ed2625c-7981-790a-4408-785c145dbfa6.png)
コメントフィールドの最後の7文字を抜粋しました。

　・last(STRING)：文字列フィールド(STRING)の最後の文字を抜粋
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/bc402e05-e49b-0547-1f48-676b4d5a5f22.png)
コメントフィールドの最後の文字を抜粋しました。

　・subscrs(N,STRING)：文字列フィールド(STRING)のN文字目を抜粋
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/ce837ed8-be35-e130-b2f3-6d9c6d702be7.png)
コメントフィールドの3文字目を抜粋しました。

　・STRING(N):文字列フィールド(STRING)のN文字目を抜粋
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/5d5f4e1b-542a-d22b-b321-8b14fc1b4b26.png)
先程と同様にコメントフィールドの3文字目を抜粋しました。

○　アルファベットの大文字小文字を変換したい場合
　・uppertolower (STRING)：文字列フィールド(STRING)のアルファベットの大文字を全角の小文字に変換
　・lowertoupper (STRING)：文字列フィールド(STRING)のアルファベットの小文字を全角の大文字に変換
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/93fadc78-460c-f0ab-8725-1f706814fd22.png)
コメントフィールドのアルファベットを全て小文字、全て大文字に変換しました。

○　フィールドの連結(結合)をしたい場合
　・FIELD1 >< FIELD2：フィールド1とフィールド2の連結(結合)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/13047000-da90-e023-e1ee-bc4fd7bb2feb.png)
コメント1フィールドとコメント2フィールドを連結しました。

【関連】
https://www.ibm.com/support/pages/spss-modeler%E3%81%A7%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92%E7%B5%90%E5%90%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

○　フィールド内の文字列を繰返したい場合
　・replicate(COUNT, STRING)：指定した回数分(COUNT)、文字列(STRING)を繰り返す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/e2ab214c-7dce-dfce-75ed-1b7bc17524cd.png)
コメントフィールドの内容を3回繰返した結果を返しました。

# ２．結果を文字の位置(数値)で返す関数

○　文字数を知りたい場合
　・length(STRING)：文字列フィールド(STRING)の文字数

○　検索文字列の登場頻度を知りたい場合
　・count_substring(STRING, SUBSTRING)：文字列フィールド(STRING)に指定した文字もしくは、文字列(SUBSTRING)の登場頻度
【関連】
https://www.ibm.com/support/pages/clem%E5%BC%8F%E3%81%A7%E7%89%B9%E5%AE%9A%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E5%AF%BE%E8%B1%A1%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%8B%E3%82%89%E8%A6%8B%E3%81%A4%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95

○　検索文字や文字列の位置(何文字目)を知りたい場合
　・issubstring(SUBSTRING, STRING)：指定した文字もしくは、文字列(SUBSTRING)を文字列フィールド(STRING)の1文字目から検索し、見つかった位置(何文字目)
見つからない場合には、偽(0)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/08f1b515-d0ea-5081-278d-7e8ade4d4cf1.png)

コメントフィールドに該当する文字が何文字目にあるか返しました。該当する文字がない場合は0を返します。
【関連】
https://www.ibm.com/support/pages/spss-modeler%E3%82%84text-analytics%E3%81%A7%E3%80%81%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E6%A4%9C%E7%B4%A2%E3%81%97%E3%81%A6%E6%8A%BD%E5%87%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

https://www.ibm.com/support/pages/sql%E3%83%97%E3%83%83%E3%82%B7%E3%83%A5%E3%83%90%E3%83%83%E3%82%AF%E3%81%A7%E6%96%87%E5%AD%97%E5%88%97%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AE%E6%AC%A0%E6%90%8D%E5%80%A4%E3%82%92%E9%99%A4%E5%A4%96%E3%81%97%E3%81%9F%E3%81%84%E3%80%82


　・issubstring(SUBSTRING, N, STRING)：指定した文字もしくは、文字列(SUBSTRING)を文字列フィールド(STRING)のN文字目から検索し、見つかった位置(何文字目)

　・isstartstring(SUBSTRING, STRING)：指定した文字もしくは、文字列(SUBSTRING)を文字列フィールド(STRING)の最初から検索し、見つかった位置(何文字目)

　・isendstring(SUBSTRING, STRING)：指定した文字もしくは、文字列(SUBSTRING)を文字列フィールド(STRING)の最後から検索し、見つかった位置(何文字目)

　・ismidstring(SUBSTRING, STRING)：指定した文字もしくは、文字列(SUBSTRING)が文字列フィールド(STRING)の最初もしくは、最後でない場合のレコードで見つかった位置

○　検索文字の位置(何文字目)を知りたい場合
　・locchar(CHAR, N, STRING)：指定した文字(CHAR)を文字列フィールド(STRING)のN文字目から検索し、見つかった位置(何文字目)
見つからない場合には、偽(0)

　・locchar_back(CHAR, N, STRING)：指定した文字(CHAR)を文字列フィールド(STRING)のN文字目から前に検索し、見つかった位置(何文字目)

　・strmember(CHAR, STRING)：locchar(CHAR, 1, STRING) と同じ。

# ３．結果を真(1)か偽(0)で返す関数
○　一致する文字列を検索したい場合
　・matches：文字列が指定したパターンに一致する場合に真を返す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/c5420a2f-3795-83b9-75d4-58d697496aea.png)
【関連】
https://www.ibm.com/support/pages/%E6%9D%A1%E4%BB%B6%E6%8A%BD%E5%87%BA%E3%83%8E%E3%83%BC%E3%83%89%EF%BC%9A%E7%89%B9%E5%AE%9A%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E3%81%8C%E5%85%A5%E5%8A%9B%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%8A%BD%E5%87%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95

◯　文字列に該当する文字種が含まれるかを判定したい場合
　・isuppercode(CHAR)：文字(CHAR)が大文字の場合に真(1)の値を返す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/8b15a34f-e936-0956-0b2d-47b063d81f1d.png)
product_idフィールドの3文字目が大文字のレコードに1を返しました。
　・islowercode(CHAR)：文字(CHAR)が小文字の場合に真(1)の値を返す
　・isnumbercode(CHAR)：文字(CHAR)の文字コードが数字の場合に真(1)の値を返す
　・isalphacode(CHAR)：文字(CHAR)の文字コードが文字の場合に真(1)の値を返す
たとえば、islowercode(product_id(2))やisnumbercode(product_id(3))やisalphacode(product_id(3))も同じように使えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/8456cb1b-048a-b077-7cc0-3d5732e6cfc9.png)

# まとめ
便利な関数はたくさんありますが、使っていないと忘れてしまいがちなのでまとめました。