Java文件读取,写入数据库

/**
 * 文件读写及数据入库工具包
 */
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();
}


}


}
  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值