【Alteryx Tips】Alteryxで未知の文字コードにあたったときの対処法

Alteryxで未知の文字コードのファイルを読み込む際の対処法について説明します

 

AlteryxACEのAkimasaKajitaniです。

 

AlteryxCSVファイルなどを読み込む際、文字化けが発生するケースがあります。Alteryxは日本語版に設定していると基本的にデフォルトの文字コード(コードページ)設定は「ANSI/OEM – 日本語Shift-JIS」となっています。 

Alteryx内では一貫して文字コードのことをコードページと記載していますが、本記事では日本語でよく使われている「文字コード」と記載します

 

ただし、最近のDesignerでは、自動検出も行ってくれるようになっており、対応している文字コードであれば設定を変えなくても文字化けなく読み込むことができます。

 

例えば、以下はUTF-8のファイルを読み込んだ際の例です。

ただ、自動コード判定がうまくいっていない場合は、文字コードを指定して読み込む必要があります。もしくは、読み込み後にConvertFromCodePage関数で変換をかける必要があります。この方法については弊社TechBlogの別記事を御覧ください。

このとき、対応している文字コードはAlteryxのヘルプ「コードページ 」に記載のとおりです。

これによると、日本語で対応している文字コードは、「ANSI/OEM - 日本語 Shift-JIS」「Unicode UTF-8」「Unicode UTF-16」の三種類ということになります。たいていShift-JISUTF-8があれば困ることはないかと思いますが、このページを読んでいる方はおそらくそれ以外で困っていると推察されます。

 

例:EUC-JPを変換してみる

 

例えば、昔のUNIXではEUC-JPという文字コードが使われていました。当然Alteryxでは以下の通り文字化けします。

 

では、これを読み込んだあとに、ConvertFromCodePage関数で変換していきましょう。複数のフィールドを一気に変換する際は、複数フィールドフォーミュラツールを使います。設定としては以下のような形になります。EUC-JP20932という番号が当てはまります(これは、マイクロソフト社のMSDNで調べることができます。こちら です)。

 

これを実行すると、以下のようにエラーが出てしまいました。 

結論としては、Alteryxでは先程紹介した表にない文字コードはサポートしていない、ということになります。

 

Alteryxがデフォルトで持っていない文字コードの対処法

 

しかしながら、世の中には様々な文字コードがあり、これに対応できると困ることがあるかと思います。Alteryxがデフォルトで持っていない文字コードの対処方としては、

  1. 外部ツールをコマンドラインで呼び出して変換をかけて保存する
  2. Pythonツールで文字コード変換を行う

の2パターンとなります。1は、様々なフリーソフトがありますが、コマンドラインで使えるものがあればそれを使えばコマンド実行ツールを使えば可能です。

 

今回は2のPythonツールでの方法をご紹介します。

 

Pythonツールで文字コード変換を行う

 シンプルなサンプルコード

Pythonでの文字コード変換は、「codecs」というモジュールを使用できます。例えば、非常にシンプルなコードだと以下のようになります。

 

from ayx import Alteryx
import codecs

# Input File Path
input_path = 'C:\\sample_euc-jp.csv' #読み込みファイルのパス
# Output File Path
output_path =  'C:\\sample_utf-8.csv' #書き込みファイルのパス

# Codec exchange
fi = codecs.open(input_path, "r", "euc-jp")
fo = codecs.open(output_path, "w", "utf-8")
for row in fi:
    fo.write(row)
fi.close()
fo.close()

 

これで所定の場所にあるeuc-jpのファイルをutf-8に変換して保存することができます。なお、codecs.openで指定するCodecの名称は、Pythoncodecsの説明ページ に記載されています。

 

複数のファイルを一気に変換する

ただ、このままのコードですと、毎回Pythonツールを開いてファイルパスを書き換えないといけないという問題があるので、Designer側からファイルパスを持ってくる形にしてみましょう。Pythonのコードは以下のとおりですが、事前にテキスト入力ツールからPythonツールへ接続し、ファイル名を入力します(今回はテキスト入力ツールにしていますが、もちろんディレクトリツールでファイルリストを取得してもオッケーです)。

 

from ayx import Alteryx
import codecs
import os

df = Alteryx.read("#1")

def create_outputfile(line):
    # ファイル名生成のロジック
    return f"{os.path.splitext(line['InputFile'])[0]}_utf-8{os.path.splitext(line['InputFile'])[1]}"

# InputFile列をベースにファイル名を作成
df['OutputFile'] = df.apply(create_outputfile, axis=1)

for index, row in df.iterrows():
    # Codec exchange
    fi = codecs.open(row['InputFile'], "r", "euc-jp")
    fo = codecs.open(row['OutputFile'], "w", "utf-8")
    for row in fi:
        fo.write(row)
    fi.close()
    fo.close()

# Output File List
Alteryx.write(df,1)

 

このコードではDesigner内のファイルパスをPythonツール内で処理するような作りになっており、複数のファイルをループで処理することができます。

 

その他考慮すべき内容

ファイルサイズが大きい場合の対処法

ファイルサイズが大きい場合はサンプルコードだと遅い可能性があります。その場合は、こちら を参照して改造してみて下さい。 

 

自動で文字コードを判定する

また、自動で文字コードを判定することもできます。chardetモジュールが利用可能です。こちら を参照して改造してみて下さい。

 

まとめ

  • Alteryxで文字コードを変換する方法をご紹介しました
  • デフォルトで対応していないものは本記事にある通りPythonツールなどで対応する必要があります

 

サンプルワークフローダウンロード

CodecExchange_Sample

 

Alteryx Designer 2024.1.1.136 パッチ: 4時点の情報です

おすすめの記事