大量のcsvデータに直面した時に、ExcelやNumbersは固まっちゃって開けないし、
ソートとかフィルターとかしたかったので適当なエディタでもダメだし、どうしたものかと悩んでいた
そこでローカルのMySQLにデータを入れるのはどうかなと思い調べてみたら、
Embulk
を使うと意外と簡単にできることがわかったのでその作業メモ
前提
embulk
embulkは、さまざまなデータベース、ストレージ、ファイル形式、およびクラウドサービス間のデータ転送をサポートするオープンソースのバルクデータローダー
pluginが豊富で、今回は以下のpluginを使って実現した
embulk-output-mysql
作業環境
- Mac
- DockerForMacはインストール済み
Embulk のインストール
GitHubのREADMEに載ってるまんま実行
$ curl --create-dirs -o ~/.embulk/bin/embulk -L "https://dl.embulk.org/embulk-latest.jar" $ chmod +x ~/.embulk/bin/embulk $ echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc $ source ~/.bashrc
バージョンを確認
$ embulk --version embulk 0.9.12
seed.yml から設定ファイルを自動生成する
Embulkはconfig.ymlを元にデータの移行する
このファイルの中で、データ移行元と移行先の両方型定義をしていく
(他にもcsvファイルの場合は文字コード、改行コード、デリミタの設定が必要)
ただ、全くのゼロから記述するのは手間なので、 embulk guess
というコマンドを使って、設定ファイル(config.yml)を自動生成する
自動生成するための最低限の情報が記載されたseed.ymlファイルというものを作る
in: type: file path_prefix: "./target.csv" out: type: stdout
in
には読み込むcsv
ファイル名を書き、out
は一旦標準出力にしておく
出力ファイル名にconfig.yml
を指定してembulk guess
コマンドを実行
$ embulk guess seed.yml -o config.yml
これでconfig.yml
が生成される
in: type: file path_prefix: ./target.csv parser: charset: UTF-8 newline: LF type: csv delimiter: ',' quote: '"' escape: '"' trim_if_not_quoted: false skip_header_lines: 1 allow_extra_columns: false allow_optional_columns: false columns: - {name: id, type: long} - {name: sub_id, type: long} - {name: name, type: string} ... out: {type: stdout}
MySQLへの出力設定
MySQLの出力用のプラグインembulk-output-mysql
をインストールする
$ embulk gem install embulk-output-mysql
config.yaml
のout
をmysql
に設定する
out: type: mysql host: localhost user: uggds password: password database: test_db table: test mode: replace
mode
はEmbulkでデータ投入する度に置き換えるか、追記するかのオプション
今回は置き換えrepalce
にする(追記の場合はinsert
)
実行
$ embulk run config.yml