Alteryxで全角・半角の変換を行う(アルファベット編)

こんにちは、小澤です。

Alteryx2018.1で日本語ベータ版が登場しました。 UIやヘルプが日本語になっていて、日本人にもなじみやすくなっているのではないでしょうか?

とはいえ、ワークフロー内の処理として日本語を扱いたい場合においては、マルチバイト文字固有の問題など、まだまだ悩まされることも多くあります。 今回は、そんな中の一つである全角と半角の変換の話をします。

全角・半角の変換

まずは、Alteryxに限らずの話で全角・半角の変換を考えてみましょう。 プログラムなんかを書いているとこの変換を行ってくれるような関数が言語の標準機能やライブラリなどで提供されている場合も多くあります。

また、自分で実装するようなことも可能です。 例えば、以下のような文字列中の全角アルファベットを半角アルファベットに変換する方法を考えます。

「数学のABC予想を証明した人はだれですか?」

変換を行うには、文字コードを考えます。 たいていの文字コードでは、半角アルファベットのA-Z、全角アルファベットのA-Zは連続しています。 そのため、文字コードに対して"全角A - 半角A"のような計算を行うことを考えたとき、すべてのアルファベットでこの値は同じになります。

Alteryxでやってみると以下のようになります(文字コードの出し方は後述)。

そのため、アルファベットにおいて

  • 全角から半角への変換はこの差分を引く
  • 半角から全角への変換はこの差分を足す

という計算で行えることがわかります。 変換全体の流れとしては

  • 文字列中の個々の文字を順に見ていく
  • 今見ている文字の文字コードが全角アルファベットの範囲か確認する
  • 範囲であれば差分を引く

という流れで実現できることがわかります。

Alteryxで確認してみる

では、Alteryxで確認してみましょう。

文字コードを取得する関数

ワークフローの内容を見ていく前に、文字コードを取得する関数を確認しておきましょう。 文字から文字コードを取得する関数は「CharToInt」となります。 以下のように、Formulaツールでこの関数の引数に対象となる文字を渡すだけです。

この関数の注意点として、引数に渡すのは"文字"であることが必須です。 2文字以上の文字列を渡すとエラーとなります。

また、文字コードを引数に受け取って文字を返す「CharFromInt」という関数もあります。 こちらも受け取るものが文字ではなく文字コードとなる以外は使い方は同じです。

全角アルファベットを半角に変換する

では、実際のワークフローを見ていきましょう。 内容は以下のようになっています。

処理の流れとしては

  1. データとして与えられた文字列を文字に分割
  2. 文字ごとに文字コードを取得
  3. 文字コードが全角アルファベットの範囲であれば差分を引く
  4. 文字コードから文字に戻す
  5. 文字を結合して文字列に戻す

となります。 順にみていきましょう。

今回扱う入力データは以下のようなものです。Text Inputツールを使って直接入力しています。

最初に行っているRecordIDの付与は、1と5を行う過程で、分割された文字が元々はどの文字列だったのかを認識するために使います。

続いてはRegExツールで文字列を文字に分割しています。 設定は以下のようになっています。

Reguler Expressionでは「.」(ドット1文字)を指定しています。 ここで指定した値でOutput MethodはTokenize、Split Rowsとしているため、縦方向に分割されます。 正規表現がよくわからない方は、「.」指定するのは「そういうもんだ」と思っていただいても今回の例では問題ありません。

これで、以下のようなデータが得られます。

続いてのFormulaツールで今回の主題である全角・半角の変換を行っています。 Formulaツールの式は以下のようになっています。

IIF(
  CharToInt([Field1]) >= 65313 and CharToInt([Field1]) <= 65370,
  CharFromInt(CharToInt([Field1]) - 65248),
  [Field1]
)

少々複雑そうに見えますね。 順に説明していきましょう。

まずIIF関数ですが、これはIF文の関数版のようなものです。

IIF(条件式, trueの場合返す値, falseの場合返す値)

という3つの引数から成り立つ関数となっています。 条件式は

CharToInt([Field1]) >= 65313 and CharToInt([Field1]) <= 65370

としています。 これは、CharToIntで文字コードを取得したのち、その値が65313~65370の範囲内であるかを調べています。 文字と文字コードの関係は以下のようになっています。

文字 文字コード
全角A 65313
全角Z 65338
全角a 65345
全角z 65370

この値での計算式では、"全角A - 半角a = 全角a - 半角a"となるのでアルファベットの大文字・小文字両方をいっぺんに扱っています。 ただし、全角Zと全角aは連続していないので、本来であればこの間の文字コードに入る文字も考慮する必要がる点には注意してください。

これで以下のような結果が得られました。

全角・半角は見た目だけ判断しづらいばあいもあるので、文字コードも併せて表示しています。

最後にSummarizeツールでRecordIDごとにGroupByして、各文字を結合しています。

文字列結合の際のSeparatorは空にしています。 これで以下のような結果が得られます。

最後に不要であればRecordIDを削除して完了となります。

逆パターンは?

今回は、全角を半角に変換しましたが、逆の半角を全角に変換するパターンも考えられます。 そういった場合は、基本的にやり方は同じです。 半角文字の範囲であれば差分の値を足してあげましょう。

IIF(
  CharToInt([Field1]) >= 65 and CharToInt([Field1]) <= 122,
  CharFromInt(CharToInt([Field1]) + 65248),
  [Field1]
)

おわりに

今回は、Alteryxでアルファベットの全角・半角を変換する方法を紹介しました。

このパターンは数字の全角・半角変換にもそのまま利用できます。 さて、今回紹介したパターンがそのまま使えなくて、よくあるパターンとしてカタカナの全角・半角変換があります。

このパターンについては別途書かせていただこうかと思います。

Alteryxの導入なら、クラスメソッドにおまかせください

日本初のAlteryxビジネスパートナーであるクラスメソッドが、Alteryxの導入から活用方法までサポートします。14日間の無料トライアルも実施中ですので、お気軽にご相談ください。

alteryx_960x400