デジタル推進課

KNIME・Excel Macro・Power Automateなど日々の業務で使用できる自動化ツールを中心に書き綴ります

KNIME - Javaで全角半角の相互変換!カタカナ・英数字・記号 ~Java Snippet~

f:id:makkynm:20210104113441p:plain

 

はじめに

 さて、今回は半角・全角変換をKNIMEで行う方法を紹介したいと思います。本記事は紹介記事で、実際のコードとサンプルワークフローはnoteの方に公開させていただきました。

note.com

 

日常業務でこんなことないでしょうか?

「住所や電話番号を入力してもらったはいいけれども、人によって全角だったり半角だったりしている。」

「システムでは半角カタカナで入力したいけれども、全角カタカナでしか入力してもらえない。」

こんな時、ExcelASC関数やJIS関数を毎回入力したり、ネットの無料変換サイトに頼るのもいいですが、これが毎回だと面倒ですよね。そのあとの工程をKNIMEで自動化されている場合、最初の部分だけマニュアルで変換とか少し格好悪いです。

 

KNIMEはOpen Sourceで誰でも利用できますが、残念ながら日本用に開発されているものではありません。なので全角・半角変換のNodeが用意されていることはありません。そこで、この機能をJava Snippet Nodeを使用して作ってみました!

Java Snippet NodeはKNIMEをインストールすると自動的に入っているので、コード/ノードをコピペするだけで誰でも簡単に全角・半角変換Nodeを使うことができます。

 

 今回のテーマ ~全角⇔半角変換 Java~

f:id:makkynm:20201231144528p:plain

今回のテーマ ~全角⇔半角変換 Java~

 

覚えてほしいこと

半角変換

変換後のコラム=ASC(変換元のコラム);

全角変換

変換後のコラム=JIS(変換元のコラム);

 

やりたいこと

全角・半角混在データ を半角に統一

もしくは

全角・半角混在データ を全角に統一

 

下図のように、各コラムを半角・全角相互に統一することを行いたいと思います。JavaのNodeなので、わざわざ2つのNodeを挿入する必要はありませんが、分かりやすくするために2つにしています。

 

f:id:makkynm:20210103235139p:plain

やりたいこと

 

全角半角変換Nodeの使い方

こちらのWorkflow・Nodeは別記事のnoteからご確認ください。

Workflow

関数の中身は同じなので、基本的にはNodeを分けなくてもいいのですが、 分かりやすく・使いやすくするように、最後の実行の部分で分けています。同時に行いたい場合は1文追加するだけでできます。

f:id:makkynm:20210103235545p:plain

Workflow - 全角・半角変換Node

 

Confirm - Before After

 下図のように、電話番号や住所を半角・全角で統一するコラムを作っていきます。

f:id:makkynm:20210103235139p:plain

Confirm - 全角・半角Node

 

Configure

このNodeは2通りの使い方があります。Java Snippet Nodeの使い方が分かる人は自由な使い方が可能です。Java Snippet Nodeの使い方は下記の記事をご覧ください。

degitalization.hatenablog.jp

 

 

半角統一の場合 - Workflowからコピーする方法

使い方が分からない方は下記のようにお使いください。一度に変換できるコラムは1つに制限されますが、誰でも使えると思います。

Step1

上のWorkflowの半角統一用のNodeをコピーして、使いたい部分につなぎます。

f:id:makkynm:20210104001330p:plain

上の例からコピー

Step2

ここでは変換元コラムと変換後コラム名を指定します。

1.変換元コラムをInputの部分から選択します。

2.OutputのNameの部分から、変換後コラム名を指定します。

 

f:id:makkynm:20210104001841p:plain

Configure - Java Snippet 半角変換Node

 

全角統一の場合 - Workflowからコピーする方法

 半角統一の時と同じ方法でできます。

Step1

上のWorkflowの全角統一用のNodeをコピーして、使いたい部分につなぎます。

Step2

変換元コラムと変換後コラム名を指定します。

1.変換元コラムをInputの部分から選択します。

2.OutputのNameの部分から、変換後コラム名を指定します。

 

半角/全角統一の場合 - 自分でコードを編集する方法

Java Snippet Nodeを使える人はこちらの方法でどうぞ。こちらの方法で行えば、複数コラム一括で変換が可能になりますし、半角変換全角変換どちらも可能です。

Step1:既存のInput/Output/Expressionを削除

まず、WorkflowからコピーしたNodeの既存のInput・Outputを削除し、Expressionもコメントのみにしてください。つまり、関数の宣言のみが上に残った状態になります。

f:id:makkynm:20210104003439p:plain

既存のInput・Outputを削除する

Step2:Inputで変換元コラムを指定

次に、Inputで元コラムを指定します。 Column Listをダブルクリックするか、Inputの部分のAddから変換元コラムを指定してください。

f:id:makkynm:20210104004105p:plain

Step2- 変換元コラムを指定

 

 

Step3:Outputで変換後のコラムを作成

次にOutputの部分のAddから、変換後のコラムを作成していきます。

ちなみにReplaceが上書き、Appendが新規追加なので、既存コラムを上書きしたい場合はReplaceを選びましょう。

f:id:makkynm:20210104004832p:plain

Step3 - Outputで変換後のコラムを作成

 

Step4:関数を挿入

最後に関数を挿入すれば完成です。関数は下記のように使ってください。

なお、変換元コラムはString型(文字列型)としてください。

半角変換

変換後のコラム=ASC(変換元のコラム);

全角変換

変換後のコラム=JIS(変換元のコラム);

f:id:makkynm:20210104005553p:plain

Step3 - 関数を挿入

同じ手順で行えば、一度に好きなだけコラムを変換することができます!

  

 ちょっと一言

本コードの注意した点

Javaで半角・全角変換を行う場合、いくつかの点に注意しないといけませんでした。その点についてこちらに記載します。

Normalizer.normalizeを使用しない

JavaにはNormalizer.normalizeという便利な関数があります。しかし、残念ながらこの関数は完全ではないそうです。これを使用してしまうと変に変換される恐れがあります。詳しくは下記のブログをご覧ください。

stealthinu.hatenadiary.jp

 

カタカナ/記号・英数字で対応を変える

カタカナ/記号変換には、マッピングテーブルを使用することで確実に変換させています。また、マッピングテーブルを採用することにより、記号の追加も可能となり、より柔軟に全角・半角変換が可能となっています。マッピングテーブルを用いて空白の変換も行っています。

英数字は文字コードの配列を利用して変換しています。

 

おわりに

半角・全角変換のNodeのコードは書くのにかなり時間を要してしまったので別途公開にしました。サンプルワークフローはKNIME v 4.1.2、Windows 版でファイルを作成していますが、使用しているNodeがJava SnippetとTable Creatorのみなので、基本的にはどのOS、バージョンからも開けるかと思います。 

 

 

余談  

みなさん、年末年始はいかがお過ごしでしょうか。私は新しいiPhoneiPhone 12 miniを購入し、ついでに携帯のキャリアも変えてしまいました。

Macを買った途端、 Appleに洗脳されてきています。Apple製品は全て揃えていくと非常に使いやすくなって行きますね。Apple Watch6も持っているので、あとはAir Podsだけとなりました。出費が止まりません(泣)

節約のための、携帯のキャリア変更は最高でした。以前までauで、月1万円くらい請求されていたのですが、Rakutenモバイルに変えて今は1年間0円です。1年後からの金額は2,980円なので全然安上がりです。そして楽天モバイルエリア圏内なのでデータ使い放題。auでは課金性のため使えなかったテザリングまで使えます。

これについて熱く語る記事でも書こうかと思うくらいです。紹介コードがあると1000ポイントほど差し上げられるみたいなので、もし欲しいという方はお声かけください。

ではまた。

 

参考リンク