はじめに
さて、今回は半角・全角変換をKNIMEで行う方法を紹介したいと思います。本記事は紹介記事で、実際のコードとサンプルワークフローはnoteの方に公開させていただきました。
日常業務でこんなことないでしょうか?
「住所や電話番号を入力してもらったはいいけれども、人によって全角だったり半角だったりしている。」
「システムでは半角カタカナで入力したいけれども、全角カタカナでしか入力してもらえない。」
こんな時、ExcelのASC関数やJIS関数を毎回入力したり、ネットの無料変換サイトに頼るのもいいですが、これが毎回だと面倒ですよね。そのあとの工程をKNIMEで自動化されている場合、最初の部分だけマニュアルで変換とか少し格好悪いです。
KNIMEはOpen Sourceで誰でも利用できますが、残念ながら日本用に開発されているものではありません。なので全角・半角変換のNodeが用意されていることはありません。そこで、この機能をJava Snippet Nodeを使用して作ってみました!
Java Snippet NodeはKNIMEをインストールすると自動的に入っているので、コード/ノードをコピペするだけで誰でも簡単に全角・半角変換Nodeを使うことができます。
今回のテーマ ~全角⇔半角変換 Java~
覚えてほしいこと
半角変換
変換後のコラム=ASC(変換元のコラム);
全角変換
変換後のコラム=JIS(変換元のコラム);
やりたいこと
全角・半角混在データ を半角に統一
もしくは
全角・半角混在データ を全角に統一
下図のように、各コラムを半角・全角相互に統一することを行いたいと思います。JavaのNodeなので、わざわざ2つのNodeを挿入する必要はありませんが、分かりやすくするために2つにしています。
全角半角変換Nodeの使い方
こちらのWorkflow・Nodeは別記事のnoteからご確認ください。
Workflow
関数の中身は同じなので、基本的にはNodeを分けなくてもいいのですが、 分かりやすく・使いやすくするように、最後の実行の部分で分けています。同時に行いたい場合は1文追加するだけでできます。
Confirm - Before After
下図のように、電話番号や住所を半角・全角で統一するコラムを作っていきます。
Configure
このNodeは2通りの使い方があります。Java Snippet Nodeの使い方が分かる人は自由な使い方が可能です。Java Snippet Nodeの使い方は下記の記事をご覧ください。
半角統一の場合 - Workflowからコピーする方法
使い方が分からない方は下記のようにお使いください。一度に変換できるコラムは1つに制限されますが、誰でも使えると思います。
Step1
上のWorkflowの半角統一用のNodeをコピーして、使いたい部分につなぎます。
Step2
ここでは変換元コラムと変換後コラム名を指定します。
1.変換元コラムをInputの部分から選択します。
2.OutputのNameの部分から、変換後コラム名を指定します。
全角統一の場合 - Workflowからコピーする方法
半角統一の時と同じ方法でできます。
Step1
上のWorkflowの全角統一用のNodeをコピーして、使いたい部分につなぎます。
Step2
変換元コラムと変換後コラム名を指定します。
1.変換元コラムをInputの部分から選択します。
2.OutputのNameの部分から、変換後コラム名を指定します。
半角/全角統一の場合 - 自分でコードを編集する方法
Java Snippet Nodeを使える人はこちらの方法でどうぞ。こちらの方法で行えば、複数コラム一括で変換が可能になりますし、半角変換全角変換どちらも可能です。
Step1:既存のInput/Output/Expressionを削除
まず、WorkflowからコピーしたNodeの既存のInput・Outputを削除し、Expressionもコメントのみにしてください。つまり、関数の宣言のみが上に残った状態になります。
Step2:Inputで変換元コラムを指定
次に、Inputで元コラムを指定します。 Column Listをダブルクリックするか、Inputの部分のAddから変換元コラムを指定してください。
Step3:Outputで変換後のコラムを作成
次にOutputの部分のAddから、変換後のコラムを作成していきます。
ちなみにReplaceが上書き、Appendが新規追加なので、既存コラムを上書きしたい場合はReplaceを選びましょう。
Step4:関数を挿入
最後に関数を挿入すれば完成です。関数は下記のように使ってください。
なお、変換元コラムはString型(文字列型)としてください。
半角変換
変換後のコラム=ASC(変換元のコラム);
全角変換
変換後のコラム=JIS(変換元のコラム);
同じ手順で行えば、一度に好きなだけコラムを変換することができます!
ちょっと一言
本コードの注意した点
Javaで半角・全角変換を行う場合、いくつかの点に注意しないといけませんでした。その点についてこちらに記載します。
Normalizer.normalizeを使用しない
JavaにはNormalizer.normalizeという便利な関数があります。しかし、残念ながらこの関数は完全ではないそうです。これを使用してしまうと変に変換される恐れがあります。詳しくは下記のブログをご覧ください。
カタカナ/記号・英数字で対応を変える
カタカナ/記号変換には、マッピングテーブルを使用することで確実に変換させています。また、マッピングテーブルを採用することにより、記号の追加も可能となり、より柔軟に全角・半角変換が可能となっています。マッピングテーブルを用いて空白の変換も行っています。
英数字は文字コードの配列を利用して変換しています。
おわりに
半角・全角変換のNodeのコードは書くのにかなり時間を要してしまったので別途公開にしました。サンプルワークフローはKNIME v 4.1.2、Windows 版でファイルを作成していますが、使用しているNodeがJava SnippetとTable Creatorのみなので、基本的にはどのOS、バージョンからも開けるかと思います。
余談
みなさん、年末年始はいかがお過ごしでしょうか。私は新しいiPhone、iPhone 12 miniを購入し、ついでに携帯のキャリアも変えてしまいました。
Macを買った途端、 Appleに洗脳されてきています。Apple製品は全て揃えていくと非常に使いやすくなって行きますね。Apple Watch6も持っているので、あとはAir Podsだけとなりました。出費が止まりません(泣)
節約のための、携帯のキャリア変更は最高でした。以前までauで、月1万円くらい請求されていたのですが、Rakutenモバイルに変えて今は1年間0円です。1年後からの金額は2,980円なので全然安上がりです。そして楽天モバイルエリア圏内なのでデータ使い放題。auでは課金性のため使えなかったテザリングまで使えます。
これについて熱く語る記事でも書こうかと思うくらいです。紹介コードがあると1000ポイントほど差し上げられるみたいなので、もし欲しいという方はお声かけください。
ではまた。
参考リンク
- Normalizerの使用について:
- 英数字の全角半角変換:
- 全角半角変換テーブル: