Embulkをファイルの解凍、文字コード変換だけに使ってみる


Embulkは有志が開発したプラグインを活用することで簡単に機能拡張ができます。
私はS3に置いてあるCSVファイルをBigQueryに入れる際によく活用するのですが、scriptで書くとちょっと面倒な複数のファイルの解凍、sjisからutf8への変換が少量の設定を記述するだけでできてしまいます。

ある時、微妙にスキーマが異なるのファイル群を処理する必要があり、
一旦、ファイルの解凍、sjisからutf8への変換をしたいものの、
スキーマが異なるために複数のyamlを作成する or 動的な処理を迫られる場面がありました。

Embulkで動的な処理をしたことが無かったため、他の方法を考えました。
embulk-parser-noneというプラグインを使えば、parseしない=スキーマが異なるファイルでも1つのyamlで処理できると考え、実践したところ、複数のファイルを解凍、sjisからutf8への変換をすることができました。

その際、Embulkをファイルの解凍、文字コード変換だけに使った設定を書き残します。

embulk-parser-none とは

作者の紹介記事 をご参照ください。

Embulkをファイルの解凍、文字コード変換だけに使ってみる

1つの圧縮されたsjisのcsvを解凍して、文字コードをutf8に変換するデモです。
(Embulkはinstall済みとする)
https://github.com/nnashiki/embulk_as_decoder に必要なファイルを置いたので、試すことができます。

必要なプラグインをinstallする

紹介したembulk-parser-noneと、解凍するためのプラグインembulk-decoder-commons-compressをinstallしてください。

$ embulk gem install embulk-parser-none
$ embulk gem install embulk-decoder-commons-compress

用意した圧縮ファイルがsjisのcsvであることの確認

ターミナルのエンコードがutf-8であれば、以下の様に文字化けするはずです。

$ unzip unzip_charset_test_sjis.csv.zip 
Archive:  unzip_charset_test_sjis.csv.zip

$ nkf --guess unzip_charset_test_sjis.csv
Shift_JIS (CRLF)

$ cat unzip_charset_test_sjis.csv
���O,�^�C�v
�q�g�J�Q,�ق̂�
�[�j�K��,�݂�
�t�V�M�_�l,����%  

yamlの中身に関して

unzip_charset_test_sjis.csv.zipを解凍して、文字コード変換し、result.csvを出力する設定です。
parserのtypeはnoneですが、charsetnewlineを設定する必要があります。
outのformatterですが、作者の紹介記事 の通りに、元の内容のまま吐き出す設定をします。ただし、charsetnewlineを設定しましょう。
execのmin_output_tasksは複数ファイルが出力されるのを防ぐために設定しました。

embulk_test.yaml
in:
  type: file
  path_prefix: unzip_charset_test_sjis.csv.zip
  decoders:
    - {type: commons-compress}
  parser:
    type: none
    column_name: payload
    charset: MS932
    newline: CRLF
exec:
  min_output_tasks: 1    # disable page scatterings
out:
  type: file
  path_prefix: result
  sequence_format: ""
  file_ext: .csv
  formatter:
    type: csv # embulk-parser-none の説明通り
    charset: UTF-8
    newline: LF
    delimiter: 0 # embulk-parser-none の説明通り
    quote_policy: NONE # embulk-parser-none の説明通り
    header_line: false # embulk-parser-none の説明通り

runする

出力したresult.csvがutf-8になっている事を確認できたかと思います。

$ embulk run embulk_test.yaml

# result.csvが作成される 

$ nkf --guess result.csv 
UTF-8 (LF)

$ cat result.csv
名前,タイプ
ヒトカゲ,ほのお
ゼニガメ,みず
フシギダネ,くさ

embulk-parser-noneでEmbulkの活用方法が広がりますね