从CSV和VCF文件中获取联系人信息

xiaoxiao2021-02-27  191

  上一篇文章中我们实现了从系统的联系人数据库中获取联系人信息。文章链接:http://blog.csdn.net/github_36878269/article/details/73826289   但是技术总监又提出了新的需求,用户想从文件中导入联系人信息,比如从华为手机助手中导出的联系人文件。在网上查找了许多的答案,有使用第三方的jar包的,比如什么我也忘了,很是坑爹。所以索性就自己分析导出的文件,从流中读取数据。

在实体机上使用系统联系人应用新建几个联系人,连接电脑,使用华为手机助手导出联系人。   1.导出为CSV格式。 导出的文件内容为:

 耐心的去分析其中数据表达的信息,该文件在windows上提示为”逗号分隔值文件”,是由引号,引号中的内容和逗号组成的。第一行为联系人信息字段,从第二行开始,每一行代表一个联系人信息,其中每一个”“中的内容为第一行字段对应的数据。比如第二行中的”张三”对应第一行中的”Given Name”,即用户姓名。

 根据这个文件格式我们可以从中获取我们想要的信息。下边是我的实现代码。

//fileExtend为选中文件的地址后缀。 if(fileExtend.equals("csv")){ //处理CSV格式数据。 EntityContact contact = null; try { while((buffer = reader.readLine()) != null){ if(buffer.startsWith("\"")){ contact = new EntityContact(); //联系人信息行,从中选择我们想要的信息。 String [] infos = buffer.split(","); contact.setName(nullChange(infos[1])); //联系人姓名。 contact.setMobile_num(nullChange(infos[5])); //联系人手机号。 contact.setHome_num(nullChange(infos[6]));//家用电话。 contact.setOffice_num(nullChange(infos[7]));//工作电话。 contact.setEmail(nullChange(infos[13]));//Email。 contact.setHome_address(nullChange(infos[17]));//家庭住址。 contact.setOffice_address(nullChange(infos[18]));//工作地址 contact.setExtend(nullChange(infos[31]));//备注。 contacts.add(contact);//放入集合。 } } } catch (Exception e) { //数据格式有问题。 contacts = null; } } private static String nullChange(String data){ return (data.equals("") ? null : data.replace("\"", "")); }

 我们就可以从contacts这个链表中获取文件中的联系人信息了。csv格式中不存放联系人的头像信息,所以我们就无法从中获取联系人的头像信息。但vcf格式的可以。

  2.vcf格式。 还是分析从华为手机助手导出的联系人文件(.vcf)。

这种格式和csv格式不同,一条联系人数据占用很多行,以”BEGIN:VCARD”为开始,以”END:VCARD”为结束,其中的每行数据代表联系人中的一条信息。如TEL;CELL:13966665555为联系人 ”lisi” 的电话号码。根据这个尿性,我们可以写出如下代码:

//fileExtend为选中文件的地址后缀。 if(fileExtend.equals("vcf")){ //处理VCF格式数据。 EntityContact contact = null; while((buffer = reader.readLine()) != null){ if(buffer.equals("BEGIN:VCARD")){ //开始标识符。 contact = new EntityContact(); } else if(buffer.startsWith("N:;")){ //名字。 buffer = buffer.substring(buffer.indexOf(";") + 1, buffer.lastIndexOf(";;;")); contact.setName(buffer); } else if(buffer.startsWith("TEL;CELL")){ //手机号。 buffer = buffer.substring(buffer.indexOf(":") + 1); contact.setMobile_num(buffer); } else if(buffer.startsWith("TEL;WORK;VOICE:")){ //工作号码。 buffer = buffer.substring(buffer.indexOf(":") + 1); contact.setOffice_num(buffer); } else if(buffer.startsWith("TEL;HOME;VOICE:")){ //家用号码。 buffer = buffer.substring(buffer.indexOf(":") + 1); contact.setHome_num(buffer); } else if(buffer.startsWith("EMAIL;HOME:")){ buffer = buffer.substring(buffer.indexOf(":") + 1); contact.setEmail(buffer); } else if(buffer.startsWith("ADR;HOME:")){ buffer = buffer.substring(buffer.indexOf(":") + 1, buffer.lastIndexOf(";;;;;;")); contact.setHome_address(buffer); } else if(buffer.startsWith("ADR;WORK:")){ buffer = buffer.substring(buffer.indexOf(":") + 1, buffer.lastIndexOf(";;;;;;")); contact.setOffice_address(buffer); } else if(buffer.startsWith("NOTE;WORK:")){ buffer = buffer.substring(buffer.indexOf(":") + 1); contact.setExtend(buffer); } else if(buffer.startsWith("PHOTO;")){ //头像数据。 buffer = buffer.substring(buffer.indexOf(":") + 1); contact.setPhoto(buffer); }else if(buffer.equals("END:VCARD")){ //结束标识符。 contacts.add(contact); } } }

 是不是很简单呢? 总结下解决流程:1.从网上查阅资料,无果,最后放弃。2.从导出的文件中,分析数据,得到数据代表的信息,将数据解析获取想要的信息。

 如果有不足的地方还请大家指出,谢谢。

下次我还会介绍这两种格式的文件的导出,以及如何获取系统目录(外部存储,USB存储)并获取文件选中的地址。

转载请注明原文地址: https://www.6miu.com/read-14316.html

最新回复(0)