写这个的缘由是某人最近要从某旧山寨手机给某(更旧的)NOKIA手机同步通讯录,由于某山寨android手机输出的vCard文件是单文件里面包含多个记录数据的格式,而NOKIA的古老同步软件只支持单记录vcf,所以就要将单个vCard文件分割成多个vcf,然而Y某本来是懒的动脑,在网上找了半天也没找到现成的办法,所以只有自己来分割了,所谓求人不若求己…方法在这里记录备用。
首先要简单了解下vCard文件的结构,旧vCard(2.1开始)是明码,很容易读取,其格式大致如下:
BEGIN:VCARD
VERSION:2.1
N:Ryouko, Asakura
FN:Asakura Ryouko
ORG: Jouhou Tougou Shinentai (JTS)
TEL;WORK:1-604-436-5505
EMAIL:r.asakura@live.com
END:VCARD
BEGIN:VCARD
VERSION:2.1
N:Yuki, Nagato
…
可以看出这只是由一系列简单的数据域组成的”field:data”结构,每个单独的联系人的数据都保存在”BEGIN:VCARD”和“END:VCARD”中间的部分,所以仅仅需要把这中间的部分单独输出一个文件就好了,很简单吧?这种事情自然要祭出文本处理专用脚本awk了:
awk ‘/BEGIN:VCARD/{name=”split”++i;}{print > name”.vcf”;}’ to_be_split.vcf
即在发现新的BEGIN:VCARD之后,迭代的生成一个“字符+数字”的新文件名,并将BEGIN:VCARD之后的部分输出到该文件名中。
不过,新的vcard似乎采用了xml格式(xcard),因此以上的脚本似乎就不太管用了,我个人是不太喜欢将xml格式运用到数据中的,因为读起来不直观,而且浪费了不少格式上的存储空间(我这种old type就是这样了)。尽管如此,有兴趣的读者仍然可以通过匹配,之类的关键字来达到类似的分割文件的效果,这里就不再赘述了。