コマンドラインで複数のCSVファイルを名寄せする方法

Nid: 673

joinコマンドを使用し、ワンライナーで複数のCSVファイルを名寄せして結合する方法です。数万件の大量データでもすぐに終わります。

1 . 入力ファイル

  • 入力ファイル1 - file1.csv(連番、場所名、place_id)
  • 入力ファイル2 - file2.csv(連番、GPS座標)
  • 入力ファイル3 - file3.csv(連番、レイティング)
$ vi file1.csv
seq,name,place_id
1,北海道神宮,ChIJrRCK4NwpC18RHtS3xF5mfN0
2,函館八幡宮,ChIJsUFEhvzynl8RFPK9IvNnRPc
3,住吉神社,ChIJTc06SryRQTURcUiuXMWgyBI
4,上川神社,ChIJkeCsOyTmDF8RMUXkml0jGl0
5,帯廣神社,ChIJv4_zty-Zc18RXD3fuwaVvBI
6,樽前山神社,
$ vi file2.csv
seq,lat,lng
1,43.0542729,141.3076588
2,41.753878,140.7102986
3,33.5859053,130.4137035
4,43.7523043,142.3647392
5,42.9307739,143.2093402
6,42.660886,141.604108
$ vi file3.csv
seq,rating
1,4.4
2,3.7
3,4.3
6,3.9

2 . csvjoin コマンドによるCSVファイルマージ

csvkit の csvjoin コマンドを使用し、連番seqをキーに名寄せ。

$ csvjoin -c seq --left file1.csv file2.csv file3.csv
seq,name,place_id,lat,lng,rating
1,北海道神宮,ChIJrRCK4NwpC18RHtS3xF5mfN0,43.0542729,141.3076588,4.4
2,函館八幡宮,ChIJsUFEhvzynl8RFPK9IvNnRPc,41.753878,140.7102986,3.7
3,住吉神社,ChIJTc06SryRQTURcUiuXMWgyBI,33.5859053,130.4137035,4.3
4,上川神社,ChIJkeCsOyTmDF8RMUXkml0jGl0,43.7523043,142.3647392,
5,帯廣神社,ChIJv4_zty-Zc18RXD3fuwaVvBI,42.9307739,143.2093402,
6,樽前山神社,,42.660886,141.604108,3.9

3 . join コマンドによるCSVファイル名寄せ

OS標準の join コマンドを使用し、入力ファイルの連番、seqフィールドをキーにマージしています。マージするために、各ファイルはキーとなるフィールドでソートされていることが必要です。

-j1:1つ目のフィールドをキーに結合。

-a1:ファイル1のマッチしないレコードも出力。

$ join -j1 -t, -a1 file1.csv file2.csv | join -j1 -t, -a1 - file3.csv
seq,name,place_id,lat,lng,rating
1,北海道神宮,ChIJrRCK4NwpC18RHtS3xF5mfN0,43.0542729,141.3076588,4.4
2,函館八幡宮,ChIJsUFEhvzynl8RFPK9IvNnRPc,41.753878,140.7102986,3.7
3,住吉神社,ChIJTc06SryRQTURcUiuXMWgyBI,33.5859053,130.4137035,4.3
4,上川神社,ChIJkeCsOyTmDF8RMUXkml0jGl0,43.7523043,142.3647392,
5,帯廣神社,ChIJv4_zty-Zc18RXD3fuwaVvBI,42.9307739,143.2093402,
6,樽前山神社,,42.660886,141.604108,3.9