CSVをJSONに変換するためのNode.jsライブラリ「csv2json」

2019-03-09Bash, JavaScript

はじめに

JSON データをinputとして処理するテストコードを書きたかったが、参考にするテストデータが CSV フォーマットだったために簡単に変換できないかと探していたところ良いものを見つけました。

検証環境

$ uname -moi
x86_64 MacBookPro10,1 Darwin

$ bash -version
GNU bash, バージョン 5.0.2(1)-release (x86_64-apple-darwin18.2.0)

必要なもの

npm でインストールするツール&ライブラリのため、 Node.js の実行環境が必要です。

実行環境がない場合は Node Version ManagerNode.js がインストールできます。
( Redhut/Fedora/CentOSなら yum 、 Ubuntu/Debianなら apt-get 、 Macなら brew を使ってインストールすることもできるが、以下の方法ならどの環境でもセットアップ可能。 )

# **Node Version Manager** ( 複数のアクティブなnode.jsバージョンを管理するためのシンプルなbashスクリプト ) を利用
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash

$ cat <<'EOF' >>~/.bashrc
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion
EOF

$ . ~/.bashrc

$ nvm install --latest-npm

$ node --version
v11.10.1

csv2json のインストール

npm コマンドが使えるようになっていれば以下のコマンドでインストールが可能です。

# ツールの導入
$ npm install --global csv2json

# 正常にインストールができているかを確認
$ csv2json -help
Usage: csv2json [OPTIONS] [<input file> [<output file>]]

  -d, --dynamic-typing
    Convert booleans and numeric to their type instead of strings.

  -s <separator>, --separator=<separator>
    Field separator to use (default to comma “,”).

  -t, --tsv
    Use tab as separator, overrides separator flag.

  <input file>
    CSV file to read data from.
    If unspecified or a dash (“-”), use the standard input.

  <output file>
    JSON file to write data to.
    If unspecified or a dash (“-”), use the standard output.

csv2json v1.4.2

# コマンドはどこにインストールされているのかを確認
$ type csv2json
csv2json is hashed (/home/genzouw/.nvm/versions/node/v11.10.1/bin/csv2json)

使い方

実際に仕事で使用したCSVファイルをここに掲載することはできないので、サンプルデータを以下のサイトの機能を使って用意します。

ダウンロードした10件の疑似個人情報(CSV)は以下のようなものになっていました。

(例)personal_infomation.csv

このファイルに対して、 csv2json コマンドを適用するとJSONデータが作成できます。

# ファイルの存在を確認
$ ls
personal_infomation.csv

# 中身を覗いてみる
$ cat personal_infomation.csv
連番,氏名,氏名(カタカナ),性別,電話番号,生年月日
1,浜崎陽治,ハマザキヨウジ,男,0238930217,1974/11/03
2,奥山隆雄,オクヤマタカオ,男,0888070241,1997/08/04
3,船越瑠奈,フナコシルナ,女,0986044637,1966/04/16
4,玉置忠治,タマキタダハル,男,0779869154,1995/07/19
5,出口美香,デクチミカ,女,0289679894,1991/10/18
6,西本良之,ニシモトヨシユキ,男,0855699116,1988/03/29
7,湯川麗奈,ユカワレナ,女,0997770517,1996/03/05
8,荻野莉沙,オギノリサ,女,073800935,1987/06/20
9,海野博明,ウミノヒロアキ,男,0888070499,1998/05/23
10,高崎淳一,タカサキジュンイチ,男,0559462109,1982/05/10

# columnコマンドを使って整形してみます。6列の情報があります。
$ cat personal_infomation.csv | column -t -s,
連番  氏名      氏名(カタカナ)    性別  電話番号    生年月日
1     浜崎陽治  ハマザキヨウジ      男    0238930217  1974/11/03
2     奥山隆雄  オクヤマタカオ      男    0888070241  1997/08/04
3     船越瑠奈  フナコシルナ        女    0986044637  1966/04/16
4     玉置忠治  タマキタダハル      男    0779869154  1995/07/19
5     出口美香  デクチミカ          女    0289679894  1991/10/18
6     西本良之  ニシモトヨシユキ    男    0855699116  1988/03/29
7     湯川麗奈  ユカワレナ          女    0997770517  1996/03/05
8     荻野莉沙  オギノリサ          女    073800935   1987/06/20
9     海野博明  ウミノヒロアキ      男    0888070499  1998/05/23
10    高崎淳一  タカサキジュンイチ  男    0559462109  1982/05/10

# csv2json コマンドを適用してみる
$ cat personal_infomation.csv | csv2json
[
{"連番":"1","氏名":"浜崎陽治","氏名(カタカナ)":"ハマザキヨウジ","性別":"男","電話番号":"0238930217","生年月日":"1974/11/03"},
{"連番":"2","氏名":"奥山隆雄","氏名(カタカナ)":"オクヤマタカオ","性別":"男","電話番号":"0888070241","生年月日":"1997/08/04"},
{"連番":"3","氏名":"船越瑠奈","氏名(カタカナ)":"フナコシルナ","性別":"女","電話番号":"0986044637","生年月日":"1966/04/16"},
{"連番":"4","氏名":"玉置忠治","氏名(カタカナ)":"タマキタダハル","性別":"男","電話番号":"0779869154","生年月日":"1995/07/19"},
{"連番":"5","氏名":"出口美香","氏名(カタカナ)":"デクチミカ","性別":"女","電話番号":"0289679894","生年月日":"1991/10/18"},
{"連番":"6","氏名":"西本良之","氏名(カタカナ)":"ニシモトヨシユキ","性別":"男","電話番号":"0855699116","生年月日":"1988/03/29"},
{"連番":"7","氏名":"湯川麗奈","氏名(カタカナ)":"ユカワレナ","性別":"女","電話番号":"0997770517","生年月日":"1996/03/05"},
{"連番":"8","氏名":"荻野莉沙","氏名(カタカナ)":"オギノリサ","性別":"女","電話番号":"073800935","生年月日":"1987/06/20"},
{"連番":"9","氏名":"海野博明","氏名(カタカナ)":"ウミノヒロアキ","性別":"男","電話番号":"0888070499","生年月日":"1998/05/23"},
{"連番":"10","氏名":"高崎淳一","氏名(カタカナ)":"タカサキジュンイチ","性別":"男","電話番号":"0559462109","生年月日":"1982/05/10"}
]

# jq コマンドで整形すると見やすい。先頭15行を表示してみます。
$ cat personal_infomation.csv | csv2json | jq . | head -n 15
[
  {
    "連番": "1",
    "氏名": "浜崎陽治",
    "氏名(カタカナ)": "ハマザキヨウジ",
    "性別": "男",
    "電話番号": "0238930217",
    "生年月日": "1974/11/03"
  },
  {
    "連番": "2",
    "氏名": "奥山隆雄",
    "氏名(カタカナ)": "オクヤマタカオ",
    "性別": "男",
    "電話番号": "0888070241",

ひとこと

TSVや別の区切り文字にも対応しています。
JSONが1つの配列オブジェクトになるのが嫌であれば、以下のようにして行単位にオブジェクトを出力させることもできます。

# jq でバラす
$ cat personal_infomation.csv | csv2json | jq -c '.[]'
{"連番":"1","氏名":"浜崎陽治","氏名(カタカナ)":"ハマザキヨウジ","性別":"男","電話番号":"0238930217","生年月日":"1974/11/03"}
{"連番":"2","氏名":"奥山隆雄","氏名(カタカナ)":"オクヤマタカオ","性別":"男","電話番号":"0888070241","生年月日":"1997/08/04"}
{"連番":"3","氏名":"船越瑠奈","氏名(カタカナ)":"フナコシルナ","性別":"女","電話番号":"0986044637","生年月日":"1966/04/16"}
{"連番":"4","氏名":"玉置忠治","氏名(カタカナ)":"タマキタダハル","性別":"男","電話番号":"0779869154","生年月日":"1995/07/19"}
{"連番":"5","氏名":"出口美香","氏名(カタカナ)":"デクチミカ","性別":"女","電話番号":"0289679894","生年月日":"1991/10/18"}
{"連番":"6","氏名":"西本良之","氏名(カタカナ)":"ニシモトヨシユキ","性別":"男","電話番号":"0855699116","生年月日":"1988/03/29"}
{"連番":"7","氏名":"湯川麗奈","氏名(カタカナ)":"ユカワレナ","性別":"女","電話番号":"0997770517","生年月日":"1996/03/05"}
{"連番":"8","氏名":"荻野莉沙","氏名(カタカナ)":"オギノリサ","性別":"女","電話番号":"073800935","生年月日":"1987/06/20"}
{"連番":"9","氏名":"海野博明","氏名(カタカナ)":"ウミノヒロアキ","性別":"男","電話番号":"0888070499","生年月日":"1998/05/23"}
{"連番":"10","氏名":"高崎淳一","氏名(カタカナ)":"タカサキジュンイチ","性別":"男","電話番号":"0559462109","生年月日":"1982/05/10"}

※もっとも、 jq コマンドだけで csv をJSONに変換できるそうです。(T_T)

2019-03-09Bash, JavaScript