最近按客户需求实现了核心与业务系统数据导入功能。核心系统生成txt备份文件,文件第一行以begin开始,结尾行以end结束,每行数据采用“|”进行分隔。读取文件时需要对每个数据列长度进行判断,对不正确的数据列进行过滤,功能实现了,大家看看可否进行适当的优化?
导入的工具类:
package com.luck.manage.importdata.daoimpl;
import static javax.ejb.TransactionAttributeType.NEVER;
import java.io.BufferedReader;
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.RandomAccessFile;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.LinkedHashMap;
import javax.ejb.TransactionAttribute;
import com.luck.framework.core.PersistentService;
import com.luck.manage.importdata.dao.ReadDataToDbDao;
import com.luck.manage.importdata.vo.CsResultVo;
import com.luck.util.ValidateStringCode;
/**
*
* @author jos.gaobo
*
*/
public class ReadDataToDbDaoImpl extends PersistentService implements
ReadDataToDbDao {
@SuppressWarnings("unchecked")
@TransactionAttribute(NEVER)
public CsResultVo readDataToDb(String tableName, File file,
String encoding, LinkedHashMap map, String dateFormat,
int autoKeyFlag, String primaryKeyName,String seqName) {
InputStream inputStream = null;
InputStreamReader is = null;
BufferedReader br = null;
CsResultVo co = new CsResultVo();
// 数据库插入操作的行号标记
int lineNum = 0;
// 标记如果出现错误行的状态
boolean bs = false;
// 读取的行号标记
int flagLineNum = 0;
try {
/**
* 读取开始和最后一行数据 判断数据是否完整
*/
RandomAccessFile randomAccessFile = new RandomAccessFile(file
.getPath(), "r");
// 读取第一行数据
String firstLineData = randomAccessFile.readLine();
// 获取文本的字符流长度
long fileStreamLenght = randomAccessFile.length();
// 将指针移到文本文件的末尾行 最后一行是以 end 结束标志
randomAccessFile.seek(fileStreamLenght - 3);
// 最后一行数据
String endLineData = randomAccessFile.readLine();
// 文件是否完整
boolean flag = false;
if ("begin".equals(firstLineData) && "end".equals(endLineData)) {
flag = true;
}
randomAccessFile.close();
// 文件完整
if (flag) {
inputStream = new FileInputStream(file);
is = new InputStreamReader(inputStream, encoding);
br = new BufferedReader(is, 1024);
// 插入条件长度
int parsNum = map.size();
StringBuffer sql = new StringBuffer("INSERT INTO ").append(
tableName).append("(");
// 需要主键自增长
if (1 == autoKeyFlag) {
sql.append(primaryKeyName).append(",");
}
// 拼接需要插入的列名
String pars = "";
Iterator it = map.keySet().iterator();
while (it.hasNext()) {
pars += it.next().toString() + ",";
}
pars = pars.substring(0, pars.length() - 1);
sql.append(pars.toUpperCase()).append(") VALUES(");
// 获取插入参数类型
String dataType = map.values().toString();
dataType = dataType.replace("[", "").replace("]", "").replace(
",", "").replace(" ", "");
// 插入自增长序列
if (1 == autoKeyFlag) {
sql.append(seqName);
sql.append(",");
}
// StringBuffer的开始位置
int startDelIndex = sql.length();
// 读取的一行数据
String lineStr = "";
// 分割后的字符串数组
String[] str = null;
// 分割后的字符串数组长度
int lineStrLenght = 0;
// 批量插入的对象数组变量,存放SQL语句
String[] sqls = new String[1000];
// 批量插入的循环变量
int stringLineNum = 0;
String paths = file.getPath();
String dates = paths.substring(paths.indexOf("2"), paths
.indexOf("2") +
;
while ((lineStr = br.readLine()) != null) {
flagLineNum = flagLineNum + 1;
if (!"begin".equals(lineStr) && !"end".equals(lineStr)) {
lineNum += 1;
if (stringLineNum == 1000) {
stringLineNum = 0;
}
str = lineStr.split("\\|");
lineStrLenght = str.length;
// 读取的数据长度与实际插入的长度相符
if (parsNum == lineStrLenght) {
// 判断日期类型是否是数字的乱码标识
boolean flag1 = true;
for (int i = 0; i < str.length; i++) {
String string=str[i].trim();
char c = dataType.charAt(i);
switch (c) {
case '0':
sql.append(Integer.parseInt(string));
break;
case '1':
sql.append("to_date('").append(string)
.append("','").append(dateFormat)
.append("')");
break;
case '2':
sql.append(string);
break;
case '3':
sql.append(string);
break;
case '4':
sql.append("'").append(string).append("'");
break;
case '5':
// 验证该日期是否是数值类型
if(!string.equals(""))
flag1 = ValidateStringCode
.validateDateIsNotCode(string);
if (flag1) {
sql.append("'").append(string).append(
"'");
} else {
StringBuffer sl = new StringBuffer("INSERT INTO HXCS_LOG_SUB" +
"(id,readDate,tableName,resultInfo,state,fileName,insertDate) " +
"VALUES(HIBERNATE_SEQUENCE.Nextval,'");
sl.append(dates).append("','")
.append(tableName)
.append("','").append("第")
.append(flagLineNum).append(
"行数据无法识别,导入失败").append(
"',").append(6).append(
",'").append(paths)
.append("',sysdate)");
jt.execute(sl.toString());
stringLineNum -= 1;
lineNum -= 1;
bs = true;
}
break;
}
if (i < str.length - 1) {
sql.append(",");
}
}
sql.append(")");
if (flag1) {
// 赋值到字符串数组
sqls[stringLineNum] = sql.toString();
}
// 清空StringBuffer
sql.delete(startDelIndex, sql.length());
} else {
StringBuffer sl = new StringBuffer("INSERT INTO HXCS_LOG_SUB" +
"(id,readDate,tableName,resultInfo,state,fileName,insertDate) " +
"VALUES(HIBERNATE_SEQUENCE.Nextval,'");
sl.append(dates).append("','").append(tableName).append("','")
.append("第").append(flagLineNum).append(
"行数据无法读取").append("',").append(6)
.append(",'").append(paths).append(
"',sysdate)");
jt.execute(sl.toString());
stringLineNum -= 1;
lineNum -= 1;
bs = true;
}
stringLineNum += 1;
// 批量插入数据
if (0 != lineNum && lineNum % 1000 == 0) {
jt.batchUpdate(sqls);
}
}
}
// 插入取余后的余数
if (stringLineNum % 1000 != 0) {
for (int i = 0; i < stringLineNum; i++) {
if (!"".equals(sqls[i]) && null != sqls[i]
&& !"end".equals(sqls[i])) {
jt.execute(sqls[i]);
}
}
}
sqls = null;
sql = null;
} else {
// "1"代表 数据文件不完整。
co.setState("1");
}
} catch (FileNotFoundException e) {
// "2"代表 文件没有找到
co.setState("2");
} catch (UnsupportedEncodingException e) {
// "3"代表 "没有找到读取文件的字符集编码"
co.setState("3");
} catch (IOException e) {
// "4"代表 文件读取异常
co.setState("4");
} finally {
try {
if (br != null) {
br.close();
is.close();
inputStream.close();
}
} catch (IOException e) {
// "5"代表 关闭输入流出现异常
co.setState("5");
}
}
flagLineNum = flagLineNum - 2;
if (bs) {
co.setState("6");
}
co.setRusiltInfo("共" + flagLineNum + "行数据," + lineNum + "行数据插入成功");
return co;
}
}
调用程序示例:
@SuppressWarnings("unchecked")
@TransactionAttribute(NEVER)
public int operateManBgddj(String date) {
File file = new File(GetPath.findTftConfPath() + "/" + date
+ "/bgddj_zx.txt");
if (file.exists()) {
jt.execute("truncate table MAN_BGDDJ");
LinkedHashMap map = new LinkedHashMap();
map.put("YNGYJG", 4);
map.put("ZHNGJG", 4);
map.put("FFNGJE", 3);
map.put("QIXIRQ", 4);
map.put("DAOQRQ", 4);
map.put("JIXIZQ", 4);
map.put("ZHQIBZ", 4);
map.put("QNXIBZ", 4);
map.put("BNLJLX", 3);
map.put("BWLJLX", 3);
map.put("DAIKXZ", 4);
map.put("ZHANGH", 4);
map.put("YLYQZH", 4);
map.put("ELYQZH", 4);
map.put("dzhizh", 4);
map.put("daizzh", 4);
map.put("bnbnzh", 4);
map.put("yyqxzh", 4);
map.put("BRQXZH", 4);
map.put("bwbnzh", 4);
map.put("jieszh", 4);
map.put("dkrzzh", 4);
map.put("wtdwzh", 4);
map.put("wtjjzh", 4);
map.put("sxzczh", 4);
map.put("drhkzh", 4);
map.put("ydjjzh", 4);
map.put("kaihrq", 4);
map.put("xiohrq", 4);
map.put("weihrq", 4);
map.put("jiluzt", 4);
map.put("WJDKFL", 4);
map.put("JIEJUH", 4);
CsResultVo co = dao.readDataToDb("MAN_BGDDJ", file, "GBK", map,
"yyyy-MM-dd", 0, "", "");
insertLog(co.getState(), co.getRusiltInfo(), date, "MAN_BGDDJ");
return 0;
} else {
insertLog("2", "", date, "MAN_BGDDJ");
return 1;
}
}