用java对大量Excel表处理(去重,生成新属性,统计数量)

    近期帮老师的一位朋友做了数据处理,表格为1985-2014年的电子信息产业、汽车产业和装备制造产业的所有专利(申请号,分类号,申请人等等),其中申请号和分类号需要处理,通过处理生成其是否为融合性专利以及时间。然后统计为每年融合性专利的数量。

    第一步,对Excel表名字及页面进行处理,方便循环迭代。我是尽量把每个表切成2MB大小,大概5W条数据左右吧,因为太大了会跑的很慢,一个3MB的表格处理需要16分钟,但是2MB的仅需4分左右。 

    第二步,在eclipse中导入poi包,因为表格是2007版的,一个poi包是不能对excel表处理的,需要导入四个包。

    第三步,编写程序,实现算法,处理完的数据放入txt文件中,用逗号作为分隔符。

    第四步,从mysql workbench中导入txt文件到表中    

    第五步,通过SQL语句去重,并统计所需要的数据

 

第三步:

        主要用到了正则表达式pattern的基本用法,通过Pattern.complie.matcher()的find(start)方法,挑出所需要的数据

package 三大产业数据;

import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xssf.eventusermodel.XSSFReader;
import org.apache.poi.xssf.model.SharedStringsTable;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;


public class test1 {
	//得到专利的年份
	public static int getYear(String s1) {
		int a=((int)(s1.charAt(2))-(int)'0')*10+((int)(s1.charAt(3))-(int)'0');
		if(a>=85 && a<=99) 
			a=a+1900;
		else if(a>=0&& a<=3) 
			a=a+2000;
		else if(a==20) 
			a=((int)(s1.charAt(2))-(int)'0')*1000+((int)(s1.charAt(3))-(int)'0')*100+((int)(s1.charAt(4))-(int)'0')*10+((int)(s1.charAt(5))-(int)'0');
		return a;
	}
	public static String patternString(String s) {
			String pattern = "[A-Z]\\d\\d[A-Z]";
			String s1="";
			int i=0;
			Pattern p = Pattern.compile(pattern);
			Matcher m = p.matcher(s);
			while (m.find(i)) {
		    	  s1=s1+m.group()+";";
		    	  i=m.end()+1;
		    	  if(i>s.length())
		    		  break;
		    } 
			if(s1!="")
				s1=s1.substring(0, s1.length()-1);
			else
				s1="";
		return s1;
	}
	//判断是否为融合专利
	private static int isBlend(String a) {
		String d=patternString(a);
		String []s = d.split("\\;");
		int index=0;
		int j;
		//查看是否有不同专利
		for(j=0;j

第四步第五步,SQL代码如下

Load Data InFile 'E:/Data/38.txt' Into Table `equipment` fields terminated by ',' lines terminated by '\r\n';

insert into bus select applyID,classifyID,realDate,blendIndex from temp8 group by applyID;
select realDate,count(blendIndex) from bus where blendIndex=1 group by realDate;

       我后来做了大量的数据处理工作,强烈大家用python去做,因为真的很方便,numpy,pandas等模块真的很强大。能用库函数的尽量不要自己去写,因为库函数都是做过优化的。

       关于同一段代码处理2MB和3MB的excel表的时间差问题的话,是因为我在代码中频繁使用了加法连接字符串,效率底下,因为会频繁的拷贝字符串和分配内存,比较耗时。大家可以考虑用别的方法去做。例如python中,先把字符串存为列表,然后用''.join(list)的方法,速度会快很多。

 

 

你可能感兴趣的:(Python基础教程学习笔记)