java解析vcf格式文件导入导出

package com.yfli.test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.junit.Test;
import org.omg.CORBA.SystemException;

import com.yfli.entity.AddressBean;

/**
 * .vcf格式文件的导入导出
 * @author yfli
 *
 */
public class ImportVCFTest {

	@Test
	public void importVcf() {
		FileInputStream fis = null;
		try {
			fis = new FileInputStream(new File("src/import_contacts.vcf"));
			List<AddressBean> addressBeans = this.importVCFFileContact(fis);
			System.out.println(addressBeans.size());
			for (AddressBean addressBean : addressBeans) {
				System.out.println("tureName : " + addressBean.getTrueName());
				System.out.println("mobile : " + addressBean.getMobile());
				System.out.println("workMobile : " + addressBean.getWorkMobile());
				System.out.println("Email : " + addressBean.getEmail());
				System.out.println("--------------------------------");
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

	@Test
	public void exportVcf() {
		try {
			List<AddressBean> addressBeans = new ArrayList<AddressBean>();
			AddressBean addressBean = new AddressBean();
			addressBean.setTrueName("zhangjie");
			addressBean.setMobile("18255963695");
			addressBeans.add(addressBean);

			addressBean = new AddressBean();
			addressBean.setTrueName("张三");
			addressBean.setMobile("15255963695");
			addressBeans.add(addressBean);

			File file = new File("src/export_contacts.vcf");
			if (file.exists()) {
				file.createNewFile();
			}
			BufferedWriter reader = new BufferedWriter(new PrintWriter(file));
			for (AddressBean bean : addressBeans) {
				reader.write("BEGIN:VCARD");
				reader.write("\r\n");
				reader.write("VERSION:2.1");
				reader.write("\r\n");
				reader.write("N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:" + this.qpEncodeing(bean.getTrueName()) + ";");
				reader.write("\r\n");
				if ("" != bean.getMobile() && bean.getMobile() != null) {
					reader.write("TEL;CELL:" + bean.getMobile() + "");
					reader.write("\r\n");
				}
				if ("" != bean.getWorkMobile() && bean.getWorkMobile() != null) {
					reader.write("TEL;WORK:" + bean.getWorkMobile() + "");
					reader.write("\r\n");
				}

				if ("" != bean.getTelePhone() && bean.getTelePhone() != null) {
					reader.write("TEL;HOME:" + bean.getTelePhone() + "");
					reader.write("\r\n");
				}
				if ("" != bean.getEmail() && bean.getEmail() != null) {
					reader.write("EMAIL:" + bean.getEmail() + "");
					reader.write("\r\n");
				}
				reader.write("END:VCARD");
				reader.write("\r\n");
			}
			reader.flush();
			reader.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 导入联系人
	 * @param in
	 * @return
	 * @throws SystemException
	 */
	public static List<AddressBean> importVCFFileContact(InputStream in)
			throws SystemException {
		List<AddressBean> addressBeans = new ArrayList<AddressBean>();
		try {
			BufferedReader reader = new BufferedReader(new InputStreamReader(in));
			StringBuffer bu = new StringBuffer();

			String line;
			while ((line = ImportVCFTest.nextLine(reader)) != null) {
				bu.append(line + "\r\n");
			}
			Pattern p = Pattern.compile("BEGIN:VCARD(\\r\\n)([\\s\\S\\r\\n\\.]*?)END:VCARD");

			Matcher m = p.matcher(bu.toString());
			while (m.find()) {
				AddressBean be = new AddressBean();
				String str = m.group(0);
				Pattern pn = Pattern.compile("N;([\\s\\S\\r\\n\\.]*?)([\\r\\n])");// 姓名
				Matcher mn = pn.matcher(m.group(0));
				while (mn.find()) {
					String name = "";
					if (mn.group(1).indexOf("ENCODING=QUOTED-PRINTABLE") > -1) {
						name = mn.group(1).substring(mn.group(1).indexOf("ENCODING=QUOTED-PRINTABLE:") + "ENCODING=QUOTED-PRINTABLE:".length());
						name = name.substring(name.indexOf(":") + 1);
						if (name.indexOf(";") > -1) {
							name = name.substring(0, name.indexOf(";"));
							be.setTrueName(ImportVCFTest.qpDecoding(name));
						} else {
							be.setTrueName(ImportVCFTest.qpDecoding(name));
						}
					} else {
						Pattern pnn = Pattern.compile("CHARSET=([A-Za-z0-9-]*?):");
						Matcher mnn = pnn.matcher(mn.group(1));
						while (mnn.find()) {
							name = mn.group(1).substring(mn.group(1).indexOf(mnn.group(0)) + mnn.group(0).length());
							be.setTrueName(name);
						}
					}
				}

				String cell = "";
				Pattern p1 = Pattern.compile("TEL;CELL:([\\s*\\d*\\s*\\d*\\s*\\d*]*?)([\\r\\n])");
				Matcher m1 = p1.matcher(str);
				while (m1.find()) {
					String tel = m1.group(0);
					cell = tel.substring("TEL;CELL:".length());
				}
				be.setMobile(cell);

				String work = "";
				Pattern p2 = Pattern.compile("TEL;WORK:\\d*([\\s*\\d*\\s*\\d*\\s*\\d*]*?)([\\r\\n])");
				Matcher m2 = p2.matcher(str);
				while (m2.find()) {
					System.out.println("workTel :  " + m2.group(0));
					work = m2.group(0).substring(m2.group(0).indexOf("TEL;WORK:") + "TEL;WORK:".length());
				}
				be.setWorkMobile(work);

				String home = "";
				Pattern p3 = Pattern.compile("TEL;HOME:([\\s*\\d*\\s*\\d*\\s*\\d*]*?)([\\r\\n])");
				Matcher m3 = p3.matcher(str);
				while (m3.find()) {
					home = m3.group(0).substring(m3.group(0).indexOf("TEL;HOME:") + "TEL;HOME:".length());
				}
				be.setTelePhone(home);

				String email = "";
				Pattern p4 = Pattern.compile("\\w+(\\.\\w+)*@\\w+(\\.\\w+)+");
				Matcher m4 = p4.matcher(str);
				while (m4.find()) {
					email = m4.group(0);
				}
				be.setEmail(email);
				addressBeans.add(be);
			}
			reader.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return addressBeans;
	}

	public static String nextLine(BufferedReader reader) throws IOException {
		String line;
		String nextLine;
		do {
			line = reader.readLine();
			if (line == null){
				return null;
			}
		} while (line.length() == 0);
		while (line.endsWith("=")) {
			line = line.substring(0, line.length() - 1);
			line += reader.readLine();
		}
		reader.mark(1000);
		nextLine = reader.readLine();
		if ((nextLine != null) && (nextLine.length() > 0) && ((nextLine.charAt(0) == 0x20) || (nextLine.charAt(0) == 0x09))) {
			line += nextLine.substring(1);
		} else {
			reader.reset();
		}
		line = line.trim();
		return line;
	}

	/*
	 * 解码
	 */
	public static String qpDecoding(String str) {
		if (str == null) {
			return "";
		}
		try {
			str = str.replaceAll("=\n", "");
			byte[] bytes = str.getBytes("US-ASCII");
			for (int i = 0; i < bytes.length; i++) {
				byte b = bytes[i];
				if (b != 95) {
					bytes[i] = b;
				} else {
					bytes[i] = 32;
				}
			}
			if (bytes == null) {
				return "";
			}
			ByteArrayOutputStream buffer = new ByteArrayOutputStream();
			for (int i = 0; i < bytes.length; i++) {
				int b = bytes[i];
				if (b == '=') {
					try {
						int u = Character.digit((char) bytes[++i], 16);
						int l = Character.digit((char) bytes[++i], 16);
						if (u == -1 || l == -1) {
							continue;
						}
						buffer.write((char) ((u << 4) + l));
					} catch (ArrayIndexOutOfBoundsException e) {
						e.printStackTrace();
					}
				} else {
					buffer.write(b);
				}
			}
			return new String(buffer.toByteArray(), "UTF-8");
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}

	/*
	 * 编码
	 */

	public static String qpEncodeing(String str) {
		char[] encode = str.toCharArray();
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < encode.length; i++) {
			if ((encode[i] >= '!') && (encode[i] <= '~') && (encode[i] != '=') && (encode[i] != '\n')) {
				sb.append(encode[i]);
			} else if (encode[i] == '=') {
				sb.append("=3D");
			} else if (encode[i] == '\n') {
				sb.append("\n");
			} else {
				StringBuffer sbother = new StringBuffer();
				sbother.append(encode[i]);
				String ss = sbother.toString();
				byte[] buf = null;
				try {
					buf = ss.getBytes("utf-8");
				} catch (UnsupportedEncodingException e) {
					e.printStackTrace();
				}
				if (buf.length == 3) {
					for (int j = 0; j < 3; j++) {
						String s16 = String.valueOf(Integer.toHexString(buf[j]));
						// 抽取中文字符16进制字节的后两位,也就是=E8等号后面的两位,
						// 三个代表一个中文字符
						char c16_6;
						char c16_7;
						if (s16.charAt(6) >= 97 && s16.charAt(6) <= 122) {
							c16_6 = (char) (s16.charAt(6) - 32);
						} else {
							c16_6 = s16.charAt(6);
						}
						if (s16.charAt(7) >= 97 && s16.charAt(7) <= 122) {
							c16_7 = (char) (s16.charAt(7) - 32);
						} else {
							c16_7 = s16.charAt(7);
						}
						sb.append("=" + c16_6 + c16_7);
					}
				}
			}
		}
		return sb.toString();
	}

}

package com.yfli.entity;

public class AddressBean {
	private String trueName;
	private String mobile;
	private String workMobile;
	private String telePhone;
	private String email;

	public String getTrueName() {
		return trueName;
	}

	public void setTrueName(String trueName) {
		this.trueName = trueName;
	}

	public String getMobile() {
		return mobile;
	}

	public void setMobile(String mobile) {
		this.mobile = mobile;
	}

	public String getWorkMobile() {
		return workMobile;
	}

	public void setWorkMobile(String workMobile) {
		this.workMobile = workMobile;
	}

	public String getTelePhone() {
		return telePhone;
	}

	public void setTelePhone(String telePhone) {
		this.telePhone = telePhone;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

}
时间: 2024-11-10 08:06:41

java解析vcf格式文件导入导出的相关文章

将csv格式的数据文件导入/导出数据库+添加新的字段

最近一直忙于实验室的事情,没有好好更新博客,在抓包的过程中,遇到了很多问题. 因为我常用Wireshark将抓包信息导出为csv文件,这里简单mark一下将csv文件导入/导出到数据库的2种方法: 一.简单,但是稍慢的方法,使用Navicat for MySQL,傻瓜式导入数据库: 流程如下: 安装完成并配置好连接后界面如下: 新建数据库 进入导入向导 选择导入类型: 然后选择文件作为数据源,这里是我之前抓好的包,300w+条抓包记录 这里直接采取默认设置 同样默认 自己设置了下表明,新建了表

以太坊钱包开发系列2 - 账号Keystore文件导入导出

以太坊去中心化网页钱包开发系列,将从零开始开发出一个可以实际使用的钱包,本系列文章是理论与实战相结合,一共有四篇:创建钱包账号.账号Keystore文件导入导出.展示钱包信息及发起签名交易.发送Token(代币),这是第二篇,主要介绍钱包账号导出与导入,将对Keystore文件的生成的原理进行介绍. 如何导入Geth创建的账号? 在上一篇文章,介绍了如何使用私钥及助记词来创建账号,如果是使用已有的私钥及助记词,这其实也是账号导入的过程. 有一些同学会问,我的账号是Geth生成的,如何导入到钱包呢

如何将frm格式MYD格式MYI格式文件导入MySQL中

frm,myd,myi是属于MySQL存储数据的文件,phpMyAdmin是无法导入的. phpMyAdmin支持的文件格式为sql文件. 其实很简单: 1.找到你的mysql的安装目录下的data文件夹,新建一个文件夹,文件夹的名称是你想设计的库的名称,把这些文件(frm,myd,myi格式的文件)放到此文件夹中. 提示:也可以使用mysql管理工具创建一个数据库(例如:create database mydb;其中mydb是数据库名称),这时在data文件夹下会对应产生一个mydb的文件夹

Java 解析epub格式电子书,helloWorld程序,附带源程序和相关jar包

一.epub格式电子书 相关材料和源码均在链接中可以下载:http://pan.baidu.com/s/1bnm8YXT 包括 1.JAVA项目工程test_epub,里面包括了jar包和一本epub电子书myBook.epub 2.epub相关jar包 3.电子书myBook.epub epub格式这里就不仔细描述了,这里强调一点,epub格式是压缩格式,只需将后缀改为.zip或.rar,解压即可看到里面的文件内容. 二.JAVA解析.epub格式电子书,具体实现代码如下.写了一个简单hell

Laravel Excel 实现 Excel-CSV 文件导入导出功能

Laravel Excel 是一款基于 PHPExcel 开发的Laravel框架专用的 Excel/CSV 文件导入导出功能的扩展包,用起来的非常方便. 它的 Github 地址是:https://github.com/Maatwebsite/Laravel-Excel 安装 我们就按照GIthub上的readme文件进行安装吧. composer require "maatwebsite/excel:~2.1.0" 在 config/app.php 中注册服务提供者到 provid

关于Oracle字符集在dmp文件导入导出中的乱码影响

Oracle 在进行dmp备份和还原的时候,服务器端字符集和客户端字符集会对这个过程有较大影响,特别是数据表中存储了中文.存储过程中使用了中文编码(注释)的时候,如果没有处理好字符集的问题,在进行还原的时候就会遇到问题,我所遇到过的问题有一下几种: 1:导入后数据表中存储的中文字符成了乱码: 2:导入后存储过程中的中文字符成了乱码: 3:导入时,提示某些存储过程不存在,报IMP-00098 INTERNAL ERROR:impccr2错误: 其中问题1出现的原因是源数据库使用的字符集和你现在导入

文件导入导出

头文件:#include<stdio.h>------------------------------例子: #include<iostream>#include <stdio.h> using namespace std;int main(){//freopen("debug\\in.txt","r",stdin); //输入重定向,输入数据将从in.txt文件中读取 //freopen("debug\\out.txt

使用第三方DOM解析XML格式文件

在解析XML格式文件的时候,使用SAX解析需要实现好多代理方法,比较难记,也容易出错,现在介绍一种由Google推出的第三方DOM(Document Object Model)来解析XML文件. 首先将该第三方文件拖到工程中.谷歌下载地址:https://code.google.com/p/gdata-objectivec-client/source/browse/trunk/Source/XMLSupport/ (注:由于该三方是很久之前的版本,还是基于MRC格式下的代码,所以需要改成ARC兼

Java生成和解析XML格式文件和字符串的实例代码

1.基础知识:Java解析XML一般有四种方法:DOM.SAX.JDOM.DOM4J. 2.使用介绍1).DOM(1)简介 由W3C(org.w3c.dom)提供的接口,它将整个XML文档读入内存,构建一个DOM树来对各个节点(Node)进行操作.优点就是整个文档都一直在内存中,我们可以随时访问任何节点,并且对树的遍历也是比较熟悉的操作:缺点则是耗内存,并且必须等到所有的文档都读入内存才能进行处理. (2)示例代码: 1.基础知识:Java解析XML一般有四种方法:DOM.SAX.JDOM.DO