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

时间:2021-03-28 07:52:32

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

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

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

 耐心的去分析其中数据表达的信息,该文件在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和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存储)并获取文件选中的地址。