Modelerでたくさんの列名に似たような変換をしたいことがあります。
そういう時にはModelerスクリプトで正規表現を使えば簡単に行うことができます。
例えば以下のように集計をした後の「_Sum」の文字を一括で取り除きたいとします。
ツールのストリームのプロパティ―の実行でスクリプトのエディタを開きます。
スクリプトが「Python」になっていることを確認し、以下のPythonコードを貼り付けます。
import modeler.api
import re
stream = modeler.script.stream()
#フィルターをつなげたいノード名を指定します。。例はレコード集計
startnode = stream.findByType(None, u"レコード集計")
filternode = stream.createAt("filter",u"列名変更", startnode.getXPosition() + 120, startnode.getYPosition())
stream.link(startnode, filternode)
for c in filternode.getOutputDataModel().columnIterator():
originalName = c.getColumnName()
#置き換えたい文字列を指定。例は_sum
p = re.compile('_Sum')
#置換後の文字列を指定。例は''なので消去を意味します
changedName = p.sub('',originalName)
filternode.setKeyedPropertyValue("new_name", originalName, changedName)
貼り付けたら「このスクリプトを実行」ボタンをおして実行してみましょう。
「列名変更」というフィルターノードが追加されています。
プロパティをみると「_sum」の文字列が取り除かれています。
「プレビュー」ボタンをクリックして、プレビューを確認してみましょう。
少しプログラムを見てみます。
以下の行でフィルターノードを連結するノードを指定しています。「_Sum」は「レコード集計」ノードの処理後に付加されるので、「レコード集計」ノードの後ろにつけています。
startnode = stream.findByType(None, u"レコード集計")
以下の部分で文字列の置き換えをしています。
p = re.compile('_Sum')の'_Sum'が置換の対象文字です。
changedName = p.sub('',originalName)の''が置換後の文字です。これは空文字なので結果的には文字を消去するという意味です。
#置き換えたい文字列を指定。例は_sum
p = re.compile('_Sum')
#置換後の文字列を指定。例は''なので消去を意味します
changedName = p.sub('',originalName)
正規表現が使えるので様々な変換ができます。
例えば
p = re.compile('_.+')
とすれば、'_Sum'も'_Mean'も'_Sdev'もすべて変換対象にできます。
以下の記事などを参考にしてください。
正規表現 HOWTO
https://docs.python.org/ja/2.7/howto/regex.html#search-and-replace
テスト環境
SPSS Modeler 18.2.1
Windows 10