au のガラホ（KYF36）がほぼ壊れてiPhoneに機種変更したが、電話帳のインポートはそのままでは無理だった

# 機種変更した経緯
ガラホ（au KYF36）の充電が出来なくなり、ヤバイと思い急遽 au Shop でのプラン変更で ESIM して iPhone SE2 に機種変更した。

## 機種変更前にやっとくべきだった。。
ガラホの電話帳を移行する前に切り替えてしまったので au お預かりサービス等使用できずにスムーズに出来なかった。

## 元端末の電話帳エクスポート
色々な充電ケーブル挿したがすべて反応せずでしたが、ケーブル挿す場所に「フッ！！」って息を吹いたら充電できるようになった。
（ってかこれで充電できなかったら電池足りなくて終わってました。。。。。。

サポートツール（安心安全なんちゃら）を使用して電話帳データをSDカードにエクスポートしました。

## データフォーマット
vCard を想定していたのですが、 json でした。。。。
部分抜粋です。
（グループは無視してます）

```sample.json
[
  {
    "accountName": "Contacts",
    "accountType": "jp.kyocera.localcontacts",
    "customRington": null,
    "email": [
      {
        "data1": "xxxx@example.com",
        "data2": "4",
        "data3": null,
        "data4": null
      },
      {
        "data1": "xxxx@example.com",
        "data2": "4",
        "data3": null,
        "data4": null
      },
      {
        "data1": "xxxx@example.com",
        "data2": "3",
        "data3": null,
        "data4": null
      }
    ],
    "errorDisplayName": "田中 太郎",
    "event": [],
    "groupMembership": [
      4
    ],
    "im": [],
    "nickname": {
      "data1": "",
      "data2": "",
      "data3": ""
    },
    "note": [],
    "organization": [],
    "phone": [
      {
        "data1": "090-1234-1111",
        "data2": "2",
        "data3": null
      }
    ],
    "photo": {
      "data15": null,
      "dislayPhotoName": null
    },
    "relation": [],
    "sendToVoicemail": 0,
    "sipAddress": [],
    "starred": 0,
    "structuredName": {
      "data1": "田中 太郎",
      "data2": "",
      "data3": "田中 太郎",
      "data4": "",
      "data5": "",
      "data6": "",
      "data7": null,
      "data8": null,
      "data9": "ﾀﾅｶ ﾀﾛｳ"
    },
    "structuredPostal": [],
    "website": []
  }
]
```

## 同じ状況になっている先人がいるのでは・・・

はい、いらっしゃいました。
参考にさせていただきました。

https://entotsu44.hatenablog.com/entry/2020/02/12/060000

## そのままだと動かなかったのでちょっと加工・修正してみました。

まずは jq を使用して Contacts[N].json を一つのファイルにマージ

```shell
jq -s add Contacts*.json > all.json
```

マージした json の下部に下記の様な不要なデータがあるので vi で手動で削除

```
  },
  null,
  null,
  null,
  null,
  null,
  null,
  null,
  null,
  null,
  null,
  null,
  null,
  null,
  null,
  null,
  null,
  null,
  null,
  null,
  null,
  null
]
```

```
null,
```
削除に合わせて「null」を viで置換
( null は NameErrorになってしまうので。。)

```
:$s/null/""/g
```


## 手動で修正した json データを python で vCard 形式に変更

```json_to_vcard_convert.py
import json
output_contacts = open('./output.vcf', 'w', encoding='utf-8')

json_file = open('./all.json', 'r')
json_load = json.load(json_file)
objects_length = len(json_load)
for i in range(0, objects_length -1):
　　　　# objects_length -1 あってるかな。。。
  output_contacts.write('BEGIN:VCARD\n')
  output_contacts.write('VERSION:3.0\n')
  print(i)
  firstname = json_load[i]['structuredName']['data1']
  lastname = json_load[i]['structuredName']['data3']
  output_contacts.write('N:' + lastname + ';' + firstname + '\n')
  output_contacts.write('FN:' + firstname + ' ' + lastname + '\n')
  output_contacts.write('X-PHONETIC-LAST-NAME:' +
                       json_load[i]['structuredName']['data9'] + '\n')
  if len(json_load[i]['phone']) > 0:
    #電話番号設定が無いと json_load[i]['phone'][0] で落ちてしまう。。。
    output_contacts.write('TEL;type=CELL;type=VOICE;type=pref:' +
                       json_load[i]['phone'][0]['data1'] + '\n')
  output_contacts.write('END:VCARD' + '\n')
json_file.close()
output_contacts.close()
```

## 出来上がった vcf ファイルを airdrop 経由で iPhone に転送すれば一括登録出来ます

性・名とニックネームが両方表示されてしまいますが数百件単位で入れること考えたらまぁいいかと。。。