Apple 将地址簿数据存储在本地
sqlite3
数据库中。我想以干净一致的格式为所有联系人导出姓名和号码
数据库位于:
/Users/kellygold/Library/Application\ Support/AddressBook/Sources/<RANDOMSTRING>/AddressBook-v22.abcddb
其中RANDOMSTRING是生成的文件名
在数据库中有一个表
ZABCDPHONENUMBER
带有字段ZFULLNUMBER
但值存储不一致
注意不同的格式:
(111) 222-3333, +12223334444, 1112223333, +1 (222) 333-4444
。有些号码只以一种格式出现,有些号码有多行,同一联系人有多种格式
生成这个的查询:
SELECT DISTINCT
ZABCDRECORD.ZFIRSTNAME [FIRST NAME],
ZABCDRECORD.ZLASTNAME [LAST NAME],
ZABCDPHONENUMBER.ZFULLNUMBER [FULL NUMBER]
FROM
ZABCDRECORD
LEFT JOIN ZABCDPHONENUMBER ON ZABCDRECORD.Z_PK = ZABCDPHONENUMBER.ZOWNER
ORDER BY
ZABCDRECORD.ZLASTNAME,
ZABCDRECORD.ZFIRSTNAME,
ZABCDPHONENUMBER.ZORDERINGINDEX ASC
所需的输出平面,前面的国家代码可选:
FIRST NAME, LAST NAME, FULL NUMBER
asdf, fghj, 2223334444
bbbb, cccc, 12223334444
目前我通过将 SQLITE 查询导出为 JSON 并运行这个非常 hacky 的解决方案来处理数据
cat adbExport.json| jq '.[] | select(.["FULL NUMBER"] != null)' | sed 's/+//g'\ | sed 's/ //g' | sed 's/-//g' | sed 's/(//g'| sed 's/)//g' | jq '{FIRSTNAME: .FIRSTNAME, LASTNAME: .LASTNAME, FULLNUMBER: ("+1"+ .FULLNUMBER)}' | sed 's/+11/+1/g' > cleanContacts.json
这会生成我可以使用的有效 JSON。 (为了安全而混淆的数据)
...
{
"FIRSTNAME": "AnXXX",
"LASTNAME": "ZuckXXX",
"FULLNUMBER": "2068901111"
}
{
"FIRSTNAME": "Nick",
"LASTNAME": "fromHay",
"FULLNUMBER": "262443XXXX"
}
...
如何直接从数据库查询执行此操作?
试试这个:
#!/usr/bin/env bash
sqlite3 ~/Library/"Application Support"/AddressBook/Sources/*/AddressBook-v22.abcddb<<EOF
.mode json
SELECT DISTINCT
ZABCDRECORD.ZFIRSTNAME [FIRST NAME],
ZABCDRECORD.ZLASTNAME [LAST NAME],
ZABCDPHONENUMBER.ZFULLNUMBER [FULL NUMBER]
FROM
ZABCDRECORD
LEFT JOIN ZABCDPHONENUMBER ON ZABCDRECORD.Z_PK = ZABCDPHONENUMBER.ZOWNER
ORDER BY
ZABCDRECORD.ZLASTNAME,
ZABCDRECORD.ZFIRSTNAME,
ZABCDPHONENUMBER.ZORDERINGINDEX ASC;
EOF
我得到的结果是:
[{"FIRST NAME":null,"LAST NAME":null,"FULL NUMBER":null},
{"FIRST NAME":"Philippe","LAST NAME":"surname","FULL NUMBER":"+188888888"}]