コマンドラインで複数の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