はじめに
今回も頻出Node、文字列操作です。Excelでの関数や機能とほとんど変わりません。本当にいろんなことができます。
今回はその中から使用する頻度の高そうな関数をExcelの関数と比較しながらカバーしておきます。
今回のテーマ ~String Manipulation~
中で使用する関数によってできることが様々なので、何個も作ってしまいましたが、すべてString Manipulationで達成可能です。
Workflowは下記からダウンロードできます。
覚えてほしいこと
文字列に関して何かしたかったらとりあえずString Manipulation
Excel-KNIME関数対応表
KNIME |
|
CONCATENATE |
join |
置換 |
replace |
MID |
substr |
FIND |
indexOf |
LEN |
length |
LEFT |
substr |
RIGHT |
substr + length |
やりたいこと
やりたいこと1 - 文字結合
ExcelでいうCONCATENATE関数や、&ですね。この文字結合を使って、
「***様の残業時間の合計がXX[h]を超えました。」という文章を作ってみましょう。
やりたいこと2 - 置換
Excelでいう"ctrl+F"で出てくる機能ですね。「様」を「殿」に置き換えてみましょう。
やりたいこと3 - MID関数・FIND関数
Excelでいう、MID関数とFIND関数を使って、苗字と名前を抜き出してみましょう。
やりたいこと4 - LEFT関数・RIGHT関数
ExcelでいうMID関数とLEN関数を使って、LEFT関数とRIGHT関数を作ってみます。
やりたいこと1で作成した文章の、初めから2文字と、最後から2文字をそれぞれ抜き出してみましょう。
String Manipulationの使い方
Workflow - やりたいこと1~4
Confirm - Before After - やりたいこと1
Confirmの結果を先に見ていきます。
ExcelでいうCONCATENATE関数や、&です。文字結合を使って、
「***様の残業時間の合計がXX[h]を超えました。」という文章を作ってみましょう。
Configure
Step1 - Expression
まずはExcelの数式の部分にあたる、Expressionに数式を入力していきます。数式は緑の枠にある要素から作っていきます。
Functionの選択
まずは、上のFunctionから使いたい関数を選びます。
関数を選択すると、右のDescriptionに簡単な説明と使用例が書いてあります。なんの関数使えばいいのかわからない、、という人でもこの使用例を見ながら真似していけば、英語を読まずにどういうような関数なのかを想像できます。
使いたい関数をダブルクリックすると、Expressionに自動的にコピーすることができます。もちろん自分で手入力してもOKです。
Join関数の使い方
今回使うのは”join”という関数です。この関数はExcelのCONCATENATE関数と使い方が同じです。くっつけたい"文字列String"を()の中に記載していきます。それをカンマでつないでいくことで、くっつけることができます。
join(くっつけたい文字列1 , くっつけたい文字列2 , ....)
値の入力
次に値をExpressionに入力しています。Excelではセルを選択しますが、KNIMEではコラム単位で処理します。Excel同様、値は自分で手入力することもできますが、他のコラムや変数を参照することもできます。コラムを参照する場合は、Column Listをにある参照したいコラムをダブルクリック、変数を使用したい場合はFlow Variable Listにある変数名をダブルクリックすることで参照できます。
今回は$名前$と$残業時間[h]$のコラムを参照しながら手入力で固定値を入れるので、関数の入力方法に従って、下記のように入力しました。
join($名前$,"様","残業時間の合計が",string($残業時間[h]$),"[h]を超えました。")
ここで注意したいのが、string()というjoinとは違う関数が入っていることです。お気づきかもしれませんが、joinは文字列しか扱えません。$残業時間[h]$はもともと数字(Integer)なので一度文字列に変換する必要があります。String Manipulationは、関数でデータ型変換を行えます。新しいデータ型変換Nodeを挿入する必要はありません!
Step2 - Column Setting
最後にStep1で出てきた結果を、新しいコラムとして作るか既存のコラムを置き換えるかを設定します。
Append Columnを選べば入力したコラム名で新しいコラムを作ることができます。Replace Columnを選択すると、そのコラムをExpressionで出てきた結果で置き換えることができます。
Expressionでそのコラムを参照していた場合は、Inputで入ってきたコラムのデータを参照した後にOutputで置き換えられますので、Excelでの循環参照というようなことにはなりません。
やりたいこと1のConfigureはこれで終了です!ほとんど解説していませんが笑
正直ほとんど解説することがないので以降の解説もExpressionの説明くらいしかしません。分からなかったらExampleを真似しましょう笑
Confirm - Before After - やりたいこと2
Confirmの結果を先に見ていきます。Excelでいう"ctrl+F"で出てくる機能です。「様」を「殿」に置き換えてみましょう。
Configure - やりたいこと2
さて、ここからほとんど解説しません。Example真似するだけですし、、
大事な部分はExpressionとコラムの設定でしたね。
Replace 関数の使い方
置換は"replace"という関数です。下記のように設定してください。
replace (文字列コラム, 検索文字, 置換後文字)
また、今回はReplace Columnを指定しました。するとOutputで既存の文章のコラムを新しい置換後のデータで上書きします。
Confirm - Before After - やりたいこと3
Excelでいう、MID関数とFIND関数を使って、苗字と名前を抜き出してみましょう。
Configure - やりたいこと3
Excelの設定と同じです。ExcelでいうMID関数はsubstr、FIND関数は、indexOfを使います。
名前の列には全角のスペースが苗字と名前の間にありました。それを利用します。関数の使い方は下記のような形です。
substr(参照元文字列, 開始位置, 文字の長さ)
indexOf(参照元文字列, 検索文字)=文字開始位置
ここで注意したいのは、KNIMEでは開始位置は0から数え始めます。なので苗字を取りたい場合の開始位置は0ですよね。次に文字の長さです。indexOfも同じように0から数えられているので、今回のスペースのある位置は2となるはずです。この結果をsubstrの文字の長さの欄に入れてあげると、
「"名前"コラムの最初の文字から2文字分とる」
という意味になります。
次に名前の部分です。使うのは同じ関数ですが、文字の部分は書いてありません。これをすることによって、最後まで読み込むという意味になります。
substr(参照元文字列, 開始位置)
また、開始位置は0から空白スペース+1から名前が始まるので、下記のような数式になっています。
また、Append Columnですでにあるコラム名を指定してみました。Confirm画面から分かるように、重複した場合は自動的に(#1)が新しいほうのコラム名に追加されることになります。
Confirm - Before After - やりたいこと4
ExcelでいうMID関数とLEN関数を使って、LEFT関数とRIGHT関数を作ってみます。
やりたいこと1で作成した文章の、初めから2文字と、最後から2文字をそれぞれ抜き出してみましょう。
Configure - やりたいこと3
ExcelのLeft関数やRight関数に当たる関数がKNIMEにはないので、MID関数とLEN関数を組み合わせて表現します。
LEFT関数(文字列,文字数)=substr(文字列, 0, 文字数)
RIGHT関数(文字列,文字数)=substr(文字列, length(文字列) - 文字数)
LEFT関数については単純だと思います。開始位置を0にすれば、文字数を指定するだけでLEFT関数になります。
RIGHT関数は、別関数length()を使用しています。これは、その文字列の全体の文字数を出力する関数です。「全体文字数 - 文字数」とすることによって、開始位置が指定でき、RIGHT関数関数のように使用することができます。
おわりに
String Manipulation、万能すぎて他にも色々使いどころがあります。
連続同じ文字を使っているのを検知したり、大文字を小文字に変えたり、小文字を大文字に変えたり、文字を逆から読む形にしてみたり。。。
何か文字列を操作したい!となったら一度String Manipulationを検討してみてください。
余談
さて、文字ではなく数式を文字や芸術ととらえてしまうおススメ映画は「奇蹟がくれた数式」です。まともに教育を受けておらず、能力を軽視されていたインド人の天才数学者が、天才数学者として認められるまでを描いた実話に基づく映画です。
フェイスブック創業者マークザッカーバーグの一言が本当にその通りだなと思います。「インターネットがない時代に、ラマヌジャンは、たった一冊のノートで世界を変えたんだ。」
アインシュタインに並ぶ天才と称された天才数学者でも一人の人間で、境遇は非常に悪かったにもかかわらず、運命に取りつかれたように何かをしないといけないという使命でひたすら進んでいく姿が感動です。個人的に好きなフレーズを付けて終わりたいと思います。
「なぜそこまでする?Why would you do it? 」「運命だからですBecause I have to」
※この英語が正しいかは分かりません。
参考リンク
- すさんのBlog:
【KNIME】ノード紹介:String Manipulation 〜文字列変換の万能選手〜 - 非プログラマーのためのインフォマティクス入門。(仮)
- KNIME公式Node Pit(英語):
- KNIME Example Workflow(英語):
- Excel での文字列操作:
「Excelの便利機能活用術」LEFT関数とMID関数、FIND関数で文字列から任意の文字を抽出する|NECネクサソリューションズ