/** * 文件读写及数据入库工具包 */ package com.xxx.file; import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; /** * @author QZ_ba * 文件读取类 */ public class ReadFile3 { //建立数据库链接 static Connection con = null; //建立预编译语句对象 static Statement pstmt = null; //建立一个结果集 static ResultSet result = null; /** * 初始化数据库链接驱动 */ private void initJdbc(){ try { Class.forName("oracle.jdbc.driver.OracleDriver"); //加载驱动程序 String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl"; //数据库链接信息 String user = "admin1001"; //数据库用户名 String pass = "admin1001"; //数据库密码 con = DriverManager.getConnection(url, user, pass); //获取链接 } catch (Exception e) { e.printStackTrace(); } } /** * 文件读取操做 * @param fileName 文件名(全路径名称) * @throws IOException */ private void readFile(String fileName) throws IOException{ BufferedReader in = new BufferedReader(new FileReader(fileName)); //阅读器 String line; //行数据 String tbName = null; //标签名--数据库表名 String[] cols = null; //标签列名--数据库列名 String[] vals = null; //标签列值--数据库列值 List<String> inserList = new ArrayList<String>(); //插入语句集合 List<String> tbList = new ArrayList<String>(); //表名集合 List<String[]> colSz = new ArrayList<String[]>(); //列名数组集合 PrintWriter out = new PrintWriter(new FileWriter("F:/test/insert.txt"));// try { while(null!=(line = in.readLine())){ if(line.startsWith("<") && !line.startsWith("<!") && !line.startsWith("</")){//解析表名--以"<"开头,且不以"<!"和"</"开头 tbName = line.substring(line.indexOf("<") + 1, line.indexOf(":"));//从"<"开始截取到第一个":" tbList.add(tbName); }else if(line.startsWith("@")){//解析列名 cols = line.replaceAll("@", "").split("\\s{2,}|\t");//替换掉开头"@",按多空格或Tab键分组截取,得到列名数组 colSz.add(cols); }else if(line.startsWith("#")){//解析数据 vals = line.split("\\s{2,}|\t");//按多空格或Tab键分组截取,得到数据数组 String ists = null; //插入数据SQL ists = "INSERT INTO " + tbName + "_TEST("; for (int i = 0; i < cols.length; i++) { ists += cols[i] + ","; } ists = ists.substring(0, ists.length() - 1); ists += ") VALUES("; String val = ""; for (int i = 1; i < vals.length; i++) { if(!"NULL".equals(vals[i])){ val = vals[i]; } ists += "'" + val + "',"; val = ""; } ists = ists.substring(0, ists.length() - 1); ists += ")"; inserList.add(ists); }else{//此处出现列值中有换行的现象,须要作特殊处理 //若无插入语句,跳出当前循环,继续执行下次循环 if(null == inserList || inserList.size() == 0) continue; if(line.startsWith("//")) continue; /* 将出现换行的行按多空格或制表符进行分割 并将其数组值插入上一行插入语句的valus后 */ String[] hxStr = line.split("\\s{2,}|\t"); String insertStr = inserList.get(inserList.size() - 1).replace(")", "");//获取上一行插入语句,并将结尾处的)替换为空 for (int i = 0; i < hxStr.length; i++) { insertStr += ",'" + hxStr[i] + "'";//追加换行数据切割后的每个值 } insertStr += ")";//将values最后追加),插入语句完整 inserList.remove(inserList.size() - 1);//删除上一行插入语句 inserList.add(insertStr); //将新的插入语句插入到list中 } } for (String str : inserList) { out.write(str + ";"); out.println(); } out.flush(); System.out.println("数据插入语句写完毕!"); createTables(tbList,colSz); insertData(inserList); } catch (Exception e) { e.printStackTrace(); }finally{ try { if(null != out) out.close(); } catch (Exception e2) { e2.printStackTrace(); } } } /** * 建表操做 * @param createList */ private void createTables(List<String> tbName,List<String[]> col) { try { pstmt = con.createStatement(); int tlen = tbName.size(); //表个数 int clen = 0; //列个数 String[] cols = {}; //列名数组 String createSql = ""; String tname = ""; List<String> clist = new ArrayList<String>(); PrintWriter out = new PrintWriter(new FileWriter("F:/test/create.txt")); for (int i = 0; i < tlen; i++) { tname = tbName.get(i); cols = col.get(i); clen = cols.length; createSql = "CREATE TABLE "+tname+"_TEST("; for (int j = 0; j < clen; j++) { createSql += cols[j] + " VARCHAR2(1000),"; } createSql = createSql.substring(0, createSql.length() - 1) + ")"; out.write(createSql); out.println(); clist.add(createSql); pstmt.addBatch(createSql); } out.flush(); pstmt.executeBatch(); try { if (null != out) { out.close(); } } catch (Exception e2) { e2.printStackTrace(); } System.out.println("建表完毕!"); } catch (Exception e) { e.printStackTrace(); }finally{ } } /** * 数据入库操做 * @throws ClassNotFoundException * @throws SQLException */ private void insertData(List<String> inserList) throws ClassNotFoundException{ try{ pstmt = con.createStatement(); System.out.println("数据条数:" + inserList.size()); for (String string : inserList) { pstmt.addBatch(string); } pstmt.executeBatch(); }catch (Exception e) { e.printStackTrace(); }finally{ } } /** * @param args */ public static void main(String[] args) { ReadFile3 rd = new ReadFile3(); try { rd.initJdbc(); long begin = System.currentTimeMillis(); System.out.println("数据插入准备!开始时间为:" + begin); rd.readFile("F:/123.CIME"); long end = System.currentTimeMillis(); System.out.println("数据插入完毕!结束时间为:" + end); try { if(null != pstmt){ pstmt.close(); } if(null != con){ con.close(); } } catch (Exception e2) { } long mills = (end - begin) / 1000 / 60 ; System.out.println("耗时约:" + mills + "分钟!"); } catch (Exception e) { e.printStackTrace(); } } }