大量の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