JAVA解析VCF格式

public class VcfParser{

    private static String BEGIN = "BEGIN:VCARD";
    private static String END = "END:VCARD";


    /**
     * "VERSION", "N", "FN", "TEL", "PHOTO"
     */
    private static String[] keys = new String[] { "VERSION", "N", "FN", "TEL", "PHOTO" };


    public String fileName;
    public List<String> list = new ArrayList<String>();


    public List<Vcard> getVcards()
    {
        return vcards;
    }


    public List<Vcard> vcards = new ArrayList<Vcard>();


    public VcfFileParser(String fileName)
    {
        this.fileName = fileName;
    }


    public void parse() throws Exception
    {
        File f = new File(fileName);
        BufferedReader reader = new BufferedReader(new FileReader(f));
        String str = null;
        StringBuilder buf = new StringBuilder();
        int i = 0;
        while ((str = reader.readLine()) != null)
        {
            i++;
            if ("".equals(str))
            {
                continue;
            }
            else if (BEGIN.equals(str))
            {
                buf.delete(0, buf.length());
            }
            else if (END.equals(str))
            {
                this.list.add(buf.toString());
            }
            else
            {
                buf.append(str + "\n");
            }
        }
        System.out.println("parse " + i + " lines");


        for (String s : list)
            vcards.add(parseVcard(s));
    }


    public static Vcard parseVcard(String s)
    {
        String[] ss = s.split("\n");
        Vcard v = new Vcard();
        for (String tmp : ss)
        {
            if (tmp.startsWith(keys[0]))
            {
                v.version = tmp.substring(tmp.indexOf(":") + 1);
            }
            else if (tmp.startsWith(keys[1]))
            {
                if (tmp.indexOf("CHARSET") >= 0)
                    v.name = utf8_to_string(tmp.substring(tmp.lastIndexOf(":")+1, tmp.length() - 3));
                else
                {
                    v.name = tmp.substring(tmp.indexOf(";") + 1, tmp.length() - 3);
                }
            }
            else if (tmp.startsWith(keys[2]))
            {
                if (tmp.indexOf("CHARSET") >= 0)
                    v.fname = utf8_to_string(tmp.substring(tmp.lastIndexOf(":") + 1));
                else
                {
                    v.fname = tmp.substring(tmp.indexOf(":") + 1);
                }
            }
            else if (tmp.startsWith(keys[3]))
            {
                v.tels.add(tmp.substring(tmp.lastIndexOf(":") + 1));
            }
            else if (tmp.startsWith(keys[4]))
            {
                // v.photo = tmp;


            }
        }
        return v;
    }


    public void output()
    {
        int i = 1;
        for (Vcard s : vcards)
            System.out.println(i++ + " " + s.toString());
    }


    public static class Vcard implements Comparable
    {
        String version;
        String name;
        String fname;
        List<String> tels = new ArrayList<String>();
        String photo;
        
        
        
        
        public String getVersion() {
return version;
}


public void setVersion(String version) {
this.version = version;
}


public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}


public String getFname() {
return fname;
}


public void setFname(String fname) {
this.fname = fname;
}


public List<String> getTels() {
return tels;
}


public void setTels(List<String> tels) {
this.tels = tels;
}


public String getPhoto() {
return photo;
}


public void setPhoto(String photo) {
this.photo = photo;
}


public String toString()
        {
            return "version=" + version + ", name=" + name + ", fname=" + fname + ", tel=" + tels();
            // ", photo=" + photo;


        }


        private String tels()
        {
            if (tels.size() == 0)
                return "";
            String str = "";
            for (String t : tels)
                str = str + t + ",";
            return str.substring(0, str.length() - 1);
        }
        
        public boolean equals(Object o)
        {
            if (o instanceof Vcard)
            {
                Vcard tmp = (Vcard) o;
                return this.name.equals(tmp.name) && this.fname.equals(tmp.fname) && this.tels.equals(tmp.tels);
            }
            return false;
        }


        @Override
        public int compareTo(Object o)
        {
            return this.name.compareToIgnoreCase(((Vcard) o).name);
        }
    }


    public static String utf8_to_string(String str)
    {
        str = str.replace(";", "");
        if (str.startsWith("="))
            str = str.substring(1);
        try
        {
            String[] ss = str.split("=");
            byte[] bs = new byte[ss.length];
            // {0xE4,0xBD,0x95,0xE4,0xBC,0x9F,0xE9,0x9D,0x99};


            for (int i = 0; i < bs.length; i++)
                bs[i] = (byte) Integer.parseInt(ss[i], 16);
            return new String(bs, "utf-8");
        }
        catch (Exception e)
        {
            System.err.println("Error: " + str);
            return str;
        }
    }


    public static void main(String[] args)
    {
        List<Vcard> l = new ArrayList<Vcard>();
        for (int i = 1; i <= 8; i++)
        {
            String filename = "c:/0000" + i + ".vcf";
            System.out.println(filename);
            VcfFileParser parser = new VcfFileParser(filename);
            try
            {
                parser.parse();
                // parser.output();


            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            l.addAll(parser.getVcards());
        }
        List<Vcard> l2 = new ArrayList<Vcard>();
        for (Vcard s : l)
        {
            if (l2.contains(s))
            {
                System.out.println("s has equals " + s.toString());
            }
            else
            {
                l2.add(s);
            }
        }
        
        int i = 1;


        System.out.println("Both: ");
        for (Vcard s : l2)
        {
            System.out.println(i++ + " " + s.toString());
        }


        System.out.println("Short Num: ");
        i = 1;
        for (Vcard s : l2)
        {
            for (String t : s.tels)
            {
                if (t.length() < 4)
                    System.out.println(i++ + " " + s.toString());
            }
            if (!s.name.equals(s.fname))
                System.out.println(i++ + " " + s.toString());
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值