RESAS APIから市区町村データを取得して郡名を追加

Nid: 1411
  • Posted on: 13 July 2020
  • By: admin
  • 正規化されすぎて使いづらいので、都道府県コードと都道府県名を追加。
  • 都道府県コードが仕様と異なるため、2桁に修正。
  • 名称だけで一意になるように「都道府県名+郡名+市区町村名」のフィールドを追加。郡名は郵便局のcsvデータから取得してマージ。

データ取得コマンド 市区町村コードの先頭2桁を都道府県コードに使用

$ myapikey=xxx;for prefcode in {1..47}; do prefname=`curl -sS -H "X-API-KEY:$myapikey" "https://opendata.resas-portal.go.jp/api/v1/prefectures" | jq -r --arg prefcode "$prefcode" '.result[] | select(.prefCode==($prefcode | tonumber)) | .prefName'`;curl -sS -H "X-API-KEY:$myapikey" "https://opendata.resas-portal.go.jp/api/v1/cities?prefCode=$prefcode" | jq -r --arg prefcode "$prefcode" --arg prefname "$prefname" '.result[] | {prefCode: .cityCode | tostring | gsub("^(?<code>[0-9][0-9])[0-9]*$"; .code), cityCode: .cityCode, cityName: .cityName, bigCityFlag: .bigCityFlag, prefCodetmp: $prefcode, prefName: $prefname, cityNameLong: "\($prefname + ."cityName")"}';sleep 1s; done | tee japaneseLocalGovermentCode.json.tmp && jq -s '.' japaneseLocalGovermentCode.json.tmp >| japaneseLocalGovermentCode.json
$ jq 'length' japaneseLocalGovermentCode.json
1922

データサンプル

$ jq '.[333:336]' japaneseLocalGovermentCode.json
[
  {
    "prefCode": "06",
    "cityCode": "06201",
    "cityName": "山形市",
    "bigCityFlag": "0",
    "prefCodetmp": "6",
    "prefName": "山形県",
    "cityNameLong": "山形県山形市"
  },
  {
    "prefCode": "06",
    "cityCode": "06202",
    "cityName": "米沢市",
    "bigCityFlag": "0",
    "prefCodetmp": "6",
    "prefName": "山形県",
    "cityNameLong": "山形県米沢市"
  },
  {
    "prefCode": "06",
    "cityCode": "06203",
    "cityName": "鶴岡市",
    "bigCityFlag": "0",
    "prefCodetmp": "6",
    "prefName": "山形県",
    "cityNameLong": "山形県鶴岡市"
  }
]

データをマージしやすいように、CSVに変換。

$ jq -r '.[] | [.cityNameLong, .prefCode, .cityCode, .bigCityFlag, .prefName, .cityName]| @csv' japaneseLocalGovermentCode.json | tr -d -d '"' | sed '1icityNameLong,prefCode,cityCode,bigCityFlag,prefName,cityName' >| japaneseLocalGovermentCode.csv.tmp
$ head japaneseLocalGovermentCode.csv.tmp
cityNameLong,prefCode,cityCode,bigCityFlag,prefName,cityName
北海道札幌市,01,01100,2,北海道,札幌市
北海道札幌市中央区,01,01101,1,北海道,札幌市中央区
北海道札幌市北区,01,01102,1,北海道,札幌市北区
北海道札幌市東区,01,01103,1,北海道,札幌市東区
北海道札幌市白石区,01,01104,1,北海道,札幌市白石区
北海道札幌市豊平区,01,01105,1,北海道,札幌市豊平区
北海道札幌市南区,01,01106,1,北海道,札幌市南区
北海道札幌市西区,01,01107,1,北海道,札幌市西区
北海道札幌市厚別区,01,01108,1,北海道,札幌市厚別区

郵便局の郵便番号データを取得。マージ用に郡名を取り出し。

$ wget -c -O /tmp/ken_all.zip https://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip && unzip -o -d /tmp /tmp/ken_all.zip
$ nkf KEN_ALL.CSV | tr -d '"' | awk -F',' '{ print $7,$8 }' | uniq | sed -e 's/\([^都道府県]*[都道府県]\) \(.*[郡]\)*\(.*[市区町村]$\)/\1\3,\3,\2/' | awk -F"," 'BEGIN { OFS=","; print "cityNameLong,districtName" }{ print $1,$3 }' >| ken.csv
$ cat ken.csv | (head;tail)
cityNameLong,districtName
北海道札幌市中央区,
北海道札幌市北区,
北海道札幌市東区,
北海道札幌市白石区,
北海道札幌市豊平区,
北海道札幌市南区,
北海道札幌市西区,
北海道札幌市厚別区,
北海道札幌市手稲区,
沖縄県渡名喜村,島尻郡
沖縄県南大東村,島尻郡
沖縄県北大東村,島尻郡
沖縄県伊平屋村,島尻郡
沖縄県伊是名村,島尻郡
沖縄県久米島町,島尻郡
沖縄県八重瀬町,島尻郡
沖縄県多良間村,宮古郡
沖縄県竹富町,八重山郡
沖縄県与那国町,八重山郡

「都道府県名+市区町村名」をキーに、2つのcsvファイルをマージ。joinコマンドは日本語をキーにするとエラーとなるので、csvkitのcsvjoinコマンドを使用。

$ csvjoin -c cityNameLong --left japaneseLocalGovermentCode.csv.tmp ken.csv >| japaneseLocalGovermentCode.csv.merged
$ cat japaneseLocalGovermentCode.csv.merged | (head;tail)
cityNameLong,prefCode,cityCode,bigCityFlag,prefName,cityName,districtName
北海道札幌市,1,1100,2,北海道,札幌市,
北海道札幌市中央区,1,1101,1,北海道,札幌市中央区,
北海道札幌市北区,1,1102,1,北海道,札幌市北区,
北海道札幌市東区,1,1103,1,北海道,札幌市東区,
北海道札幌市白石区,1,1104,1,北海道,札幌市白石区,
北海道札幌市豊平区,1,1105,1,北海道,札幌市豊平区,
北海道札幌市南区,1,1106,1,北海道,札幌市南区,
北海道札幌市西区,1,1107,1,北海道,札幌市西区,
北海道札幌市厚別区,1,1108,1,北海道,札幌市厚別区,
沖縄県渡名喜村,47,47356,0,沖縄県,渡名喜村,島尻郡
沖縄県南大東村,47,47357,0,沖縄県,南大東村,島尻郡
沖縄県北大東村,47,47358,0,沖縄県,北大東村,島尻郡
沖縄県伊平屋村,47,47359,0,沖縄県,伊平屋村,島尻郡
沖縄県伊是名村,47,47360,0,沖縄県,伊是名村,島尻郡
沖縄県久米島町,47,47361,0,沖縄県,久米島町,島尻郡
沖縄県八重瀬町,47,47362,0,沖縄県,八重瀬町,島尻郡
沖縄県多良間村,47,47375,0,沖縄県,多良間村,宮古郡
沖縄県竹富町,47,47381,0,沖縄県,竹富町,八重山郡
沖縄県与那国町,47,47382,0,沖縄県,与那国町,八重山郡

マージしたファイルを整形。列順変更と、cityNameLongに郡名も含むように修正。

$ tail +2 japaneseLocalGovermentCode.csv.merged | awk -F"," 'BEGIN { OFS=","; print "prefCode,cityCode,bigCityFlag,prefName,districtName,cityName,cityNameLong" }{ print $2,$3,$4,$5,$7,$6,$5$7$6 }' >| japaneseLocalGovermentCode.csv
$ cat japaneseLocalGovermentCode.csv | (head;tail)
prefCode,cityCode,bigCityFlag,prefName,districtName,cityName,cityNameLong
1,1100,2,北海道,札幌市,,北海道札幌市
1,1101,1,北海道,札幌市中央区,,北海道札幌市中央区
1,1102,1,北海道,札幌市北区,,北海道札幌市北区
1,1103,1,北海道,札幌市東区,,北海道札幌市東区
1,1104,1,北海道,札幌市白石区,,北海道札幌市白石区
1,1105,1,北海道,札幌市豊平区,,北海道札幌市豊平区
1,1106,1,北海道,札幌市南区,,北海道札幌市南区
1,1107,1,北海道,札幌市西区,,北海道札幌市西区
1,1108,1,北海道,札幌市厚別区,,北海道札幌市厚別区
47,47356,0,沖縄県,渡名喜村,島尻郡,沖縄県島尻郡渡名喜村
47,47357,0,沖縄県,南大東村,島尻郡,沖縄県島尻郡南大東村
47,47358,0,沖縄県,北大東村,島尻郡,沖縄県島尻郡北大東村
47,47359,0,沖縄県,伊平屋村,島尻郡,沖縄県島尻郡伊平屋村
47,47360,0,沖縄県,伊是名村,島尻郡,沖縄県島尻郡伊是名村
47,47361,0,沖縄県,久米島町,島尻郡,沖縄県島尻郡久米島町
47,47362,0,沖縄県,八重瀬町,島尻郡,沖縄県島尻郡八重瀬町
47,47375,0,沖縄県,多良間村,宮古郡,沖縄県宮古郡多良間村
47,47381,0,沖縄県,竹富町,八重山郡,沖縄県八重山郡竹富町
47,47382,0,沖縄県,与那国町,八重山郡,沖縄県八重山郡与那国町