BI系统数据的导入导出会经常碰到,如何实现简易的通用导入工具呢?而不需要每次都单独开发程序实现excel数据导入。我们可以采用opencsv来解析文本文件,具体思路如下:
1.文本文件导入上传服务器
可通过jquery的ajaxfileupload异步上传,不详加描述,网上有很多相关帮助实例;
2.CSV/TXT等文本格式数据文件解析入库
代码实例:
long startTime=System.currentTimeMillis(); //计时开始
conn = SQLHandler.getInstance().getConnection(“warehouse”);
stmt = conn.createStatement(1004, 1007);
rs = stmt.executeQuery(“select * from ” + tableName
+ ” where 1=2 “);
ResultSetMetaData rsmd = rs.getMetaData();
int cols = rsmd.getColumnCount(); //获取表的列数
String paraStr = “”;
for (int i = 0; i < cols; i++) {
paraStr += “?”;
if (i < cols – 1) {
paraStr += “,”;
}
}
conn.setAutoCommit(false);
String sql = “INSERT INTO ” + tableName + ” VALUES (” + paraStr
+ “)”; //构建insert sql
pstmt = conn.prepareStatement(sql);
// 全量需先清空表数据
if (importType.equals(“2″)) {
stmt.executeUpdate(“truncate table ” + tableName);
}
File file = new File(filePath);
CSVReader reader = new CSVReader(new FileReader(PropertyUtil
.getProperty(“export.path”)
+ file.getName()),delimiter.toCharArray()[0]);
String[] nextLine = null;
while ((nextLine = reader.readNext()) != null) { //逐行导入
int colNum=(nextLine.length>cols?cols:nextLine.length);
for (int i = 0; i < colNum; i++) {
//System.out.println(nextLine[i] + ” “);
pstmt.setObject(i + 1, nextLine[i]);
}
//列数据补全
if(nextLine.length<cols)
{
for(int j=nextLine.length;j<cols;j++)
{
pstmt.setObject(j + 1, “”);
}
}
pstmt.executeUpdate();
cnt++;
if(cnt%1000==0){
System.out.println(“累计导入”+cnt+”条记录”);
}
}
conn.commit();
long endTime=System.currentTimeMillis();
message = “文本数据入库成功,共导入” + cnt + “条记录!\n耗时”+(endTime-startTime)+”ms!”;
综上,采用jdbc逐条写入方式实现起来比较灵活,但对于大批量数据导入效率是不太理想,经测试1W条3字段的文本数据完成导入需70s左右。再大量级的数据导入建议后台操作或采用相关数据库工具,避免过长的页面等待时间。
1.文本文件导入上传服务器
可通过jquery的ajaxfileupload异步上传,不详加描述,网上有很多相关帮助实例;
2.CSV/TXT等文本格式数据文件解析入库
代码实例:
long startTime=System.currentTimeMillis(); //计时开始
conn = SQLHandler.getInstance().getConnection(“warehouse”);
stmt = conn.createStatement(1004, 1007);
rs = stmt.executeQuery(“select * from ” + tableName
+ ” where 1=2 “);
ResultSetMetaData rsmd = rs.getMetaData();
int cols = rsmd.getColumnCount(); //获取表的列数
String paraStr = “”;
for (int i = 0; i < cols; i++) {
paraStr += “?”;
if (i < cols – 1) {
paraStr += “,”;
}
}
conn.setAutoCommit(false);
String sql = “INSERT INTO ” + tableName + ” VALUES (” + paraStr
+ “)”; //构建insert sql
pstmt = conn.prepareStatement(sql);
// 全量需先清空表数据
if (importType.equals(“2″)) {
stmt.executeUpdate(“truncate table ” + tableName);
}
File file = new File(filePath);
CSVReader reader = new CSVReader(new FileReader(PropertyUtil
.getProperty(“export.path”)
+ file.getName()),delimiter.toCharArray()[0]);
String[] nextLine = null;
while ((nextLine = reader.readNext()) != null) { //逐行导入
int colNum=(nextLine.length>cols?cols:nextLine.length);
for (int i = 0; i < colNum; i++) {
//System.out.println(nextLine[i] + ” “);
pstmt.setObject(i + 1, nextLine[i]);
}
//列数据补全
if(nextLine.length<cols)
{
for(int j=nextLine.length;j<cols;j++)
{
pstmt.setObject(j + 1, “”);
}
}
pstmt.executeUpdate();
cnt++;
if(cnt%1000==0){
System.out.println(“累计导入”+cnt+”条记录”);
}
}
conn.commit();
long endTime=System.currentTimeMillis();
message = “文本数据入库成功,共导入” + cnt + “条记录!\n耗时”+(endTime-startTime)+”ms!”;
综上,采用jdbc逐条写入方式实现起来比较灵活,但对于大批量数据导入效率是不太理想,经测试1W条3字段的文本数据完成导入需70s左右。再大量级的数据导入建议后台操作或采用相关数据库工具,避免过长的页面等待时间。