- 浏览: 12113 次
- 性别:
- 来自: 北京
文章分类
最新评论
近期由于项目需要,实现了从.csv或者.txt文件中读取每行信息后插入到Oracle数据库中的功能,特共享出来。用到第三方开源工具包:opencsv-1.8.jar和commons-dbutils-1.1.jar,需单独下载。
首先需要配置XML文件,如下:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<DefaultImport>Employee</DefaultImport>
<TargetTable tableName="EMPLOYEE_TEST">
<!--表中对应文件的列名和类型信息-->
<ColumnFileInfo>
<Column name="ID" type="String"/>
<Column name="DEP" type="String"/>
<Column name="NAME" type="String"/>
<Column name="AREA" type="String"/>
<Column name="AGE" type="Number"/>
<Column name="SEX" type="String"/>
<Column name="XUELI" type="String"/>
<Column name="SALARY" type="Number"/>
<Column name="PRIX" type="Date"/>
</ColumnFileInfo>
</TargetTable>
<TargetTable tableName="YFJBXX_TEST">
<ColumnFileInfo>
<Column name="GLGXZJ" type="String"/>
<Column name="YXTZJ" type="String"/>
<Column name="YFXM" type="String"/>
<Column name="JZDZ" type="String"/>
<Column name="JZDXZQH_DM" type="String"/>
<Column name="HJDZ" type="String"/>
<Column name="HJDXZQH_DM" type="String"/>
<Column name="SFZH" type="String"/>
<Column name="CSRQ" type="String"/>
<Column name="MZ_DM" type="String"/>
<Column name="WHCD_DM" type="String"/>
<Column name="HKXZ_DM" type="String"/>
<Column name="HYZK_DM" type="String"/>
<Column name="CHRQ" type="String"/>
<Column name="JRXTRQ" type="String"/>
<Column name="TCXTRQ" type="String"/>
<Column name="TCYY_DM" type="String"/>
<Column name="ZF_XM" type="String"/>
<Column name="ZF_JJDZ" type="String"/>
<Column name="ZF_JJDXZQHDM_DM" type="String"/>
<Column name="ZF_HJDZ" type="String"/>
<Column name="ZF_HJDXZQH_DM" type="String"/>
<Column name="ZF_SFZH" type="String"/>
<Column name="ZF_CSRQ" type="String"/>
<Column name="ZF_MZ_DM" type="String"/>
<Column name="ZF_WHCD_DM" type="String"/>
<Column name="ZF_HKXZ_DM" type="String"/>
<Column name="LGRZRQ" type="String"/>
</ColumnFileInfo>
<ColumnCodeInfo>
<Column name="LRSJ" type="Date"/>
<Column name="SBPCH" type="String"/>
<Column name="SBDWXZQH_DM" type="String"/>
</ColumnCodeInfo>
</TargetTable>
<ImportDealClassList>
<Bean name="ImportDirectImpl" class="fileimport.ImportDirectImpl"/>
<Bean name="ImportWISImpl" class="fileimport.ImportWISImpl"/>
</ImportDealClassList>
<MaxCommitNumber>5000</MaxCommitNumber>
</root>
文件中描述了2个导入工作:(1)表EMPLOYEE_TEST(2)表YFJBXX_TEST,文件中每张表的列名和类型需要和导入的目标表一致,且顺序和文件中要导入的内容相匹配,例如下面的csv文件:
"ID","DEP","NAME","AREA","AGE","SEX","XUELI","SALARY","PRIX"
"001","研发","张三","北京","34","女","本科","4546","1"
"002","销售","李四","天津","45","男","专科","4456","2"
可以看到导入的顺序和上述XML文件中的列名一致。
如果从文件导入到数据库中完全匹配,只需配置文件中的<Bean name="ImportDirectImpl" class="fileimport.ImportDirectImpl"/>即可,代码中调用示例:
//设置XML配置文件所在位置
FileImportInitFactory.setConfigFileName("E:/EclipseProjects/WISImport/bin/fileimport/FileImportConfig.xml");
&nb
sp; FileImportInitFactory.init();
HashMap h = new HashMap(1,1);
//如果有日期型的列,需要设置DateFormat并放入HashMap中
h.put("DateFormat","yyyy-MM-dd HH:mm:ss");
//执行导入工作
new ImportFileEntry().importFile("导入的文件路径及名称.csv","YFJBXX_TEST",false,"ImportDirectImpl",h);
ImportFileEntry()的importFile方法说明:
/**
* 从文件导入到指定表中
* @param fileName String 要导入文件名
* @param tableName String 导入目标表名
* @param firstLineRead boolean 是否读取第一行
* @param dealClass 处理类名称(例如配置文件中Bean name="ImportDirectImpl")
* @param aHashMap 扩展用,需特殊处理时可置入变量
* @throws Exception
*/
public void importFile(String fileName, String tableName, boolean firstLineRead,String dealClass,HashMap aHashMap) throws Exception ;
至此,一个简单的不需做任何处理直接从文件导入数据库对应表的功能就实现了。
但是有些时候我们需要进行特殊的处理,例如表中的当前操作日期列在导入文件中没有,需要在代码中加入,这时就需要实现FileImportInterface接口并加入到配置文件中例如:<Bean name="ImportWISImpl" class="fileimport.ImportWISImpl"/>,ImportWISImpl的实现代码见后续代码清单。
t;);
columnListInfoCode[i][0] = columnName;
columnListInfoCode[i][1] = columnType;
System.out.println("Code columnName:" + columnName + " columnType:" + columnType);
}
}
//生成实例
ImportTableInfoBO importAction = new ImportTableInfoBO();
importAction.setTableName(tableName);
importAction.setColumnNamesFile(columnListInfoFile);
if (columnListInfoCode != null) {
importAction.setColumnNamesCode(columnListInfoCode);
}
//放入静态容器中
importJobList.put(tableName, importAction);
}
//2.其他配置信息
Element importDealClassList = (Element) eroot.getElementsByTagName("ImportDealClassList").item(0);
String className;
String classFullName;
NodeList beanList = importDealClassList.getElementsByTagName("Bean");
for (int j=0; j < beanList.getLength(); j++){
className = ( (Element) beanList.item(j)).getAttribute("name");
classFullName = ( (Element) beanList.item(j)).getAttribute("class");
dealClassList.put(className,classFullName);
}
System.out.println("importJobList.size()" + importJobList.size());
System.out.println("dealClassList.size()" + dealClassList.size());
; insertNum = 1;
} else {
insertNum++;
}
}
} catch (Exception e) {
e.printStackTrace();
//---写入数据库待加入----
//log.error(e.getMessage());
}
}
public void close() {
if (conn != null) {
try {
if (conn != null) {
DbUtils.commitAndClose(conn);
System.out.println("close end");
}
} catch (SQLException e) {
e.printStackTrace();
//log.error(e.getCause());
}
}
}
/**
*
* @param dateString String
* @param format String
* @return Date
*/
public Date formatDate(String dateString,String format){
try{
SimpleDateFormat f = new SimpleDateFormat(format);
return f.parse(dateString);
}catch(Exception e){
return null;
}
}
}
八、调用示例
package fileimport;
import java.util.HashMap;
public class ImportFileExample {
public ImportFileExample() {
}
public static void main(String[] args) {
try {
String ls = "c:/temp/employee_test.csv";
FileImportInitFactory.setConfigFileName("c:/temp/FileImportConfig.xml");
FileImportInitFactory.init();
HashMap h = new HashMap(1,1);
h.put("DateFormat","yyyy-MM-dd HH:mm:ss");
new ImportFileEntry().importFile(ls,"EMPLOYEE_TEST",false,"ImportDirectImpl",h);
//new ImportFileEntry().importFile(ls,"YFJBXX_TEST",false,"ImportWISImpl",h);
} catch (Exception e) {
e.printStackTrace();
}
}
}
文章出处:http://www.diybl.com/course/3_program/java/javashl/2008521/117640_8.html
源代码清单:
一、读取配置文件,初始化参数
package fileimport;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import java.util.HashMap;
/**
* 配置文件中读取信息赋值到创建实例,放入容器中
* @author lihf
* @version 1.0
*/
public class FileImportInitFactory {
private static HashMap importJobList = new HashMap();
private static HashMap dealClassList = new HashMap();
private static String configFileName="./FileImportConfig.xml";
public static void setConfigFileName(String fileName){
configFileName = fileName;
}
/**
* 读取配置文件初始化ImportAction
* @param fileName String 配置文件名
*/
public static void init() {
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new File(configFileName));
Element eroot = (Element) doc.getElementsByTagName("root").item(0);
int talbeListNum = eroot.getElementsByTagName("TargetTable").getLength();
System.out.println("talbeListNum:" + talbeListNum);
//1、表信息
for (int j = 0; j < talbeListNum; j++) {
Element targetTable = (Element) eroot.getElementsByTagName("TargetTable").item(j);
String tableName = targetTable.getAttribute("tableName");
System.out.println("TableName:" + tableName);
//取得文件与表中列匹配的信息列表
Element eColumnFileInfo = (Element) targetTable.getElementsByTagName("ColumnFileInfo").item(0);
NodeList tableColumnList = eColumnFileInfo.getElementsByTagName("Column");
int ColumnListNum = tableColumnList.getLength();
String columnName, columnType;
String columnListInfoFile[][] = new String[ColumnListNum][2];
for (int i = 0; i < ColumnListNum; i++) {
columnName = ( (Element) tableColumnList.item(i)).getAttribute("name");
columnType = ( (Element) tableColumnList.item(i)).getAttribute("type");
columnListInfoFile[i][0] = columnName;
columnListInfoFile[i][1] = columnType;
System.out.println("File columnName:" + columnName + " columnType:" + columnType);
}
//取得文件中没有的列,需特殊处理入库的列信息列表
Element eColumnCodeInfo = (Element) targetTable.getElementsByTagName("ColumnCodeInfo").item(0);
String columnListInfoCode[][] = null;
if (eColumnCodeInfo != null) {
tableColumnList = eColumnCodeInfo.getElementsByTagName("Column");
ColumnListNum = tableColumnList.getLength();
columnListInfoCode = new String[ColumnListNum][2];
for (int i = 0; i < ColumnListNum; i++) {
columnName = ( (Element) tableColumnList.item(i)).getAttribute("name");
columnType = ( (Element) tableColumnList.item(i)).getAttribute("type&quo
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根据表名返回实例(表列表信息)
* @param tableName String
* @return ImportAction
*/
public static ImportTableInfoBO getImportAction(String tableName) {
return (ImportTableInfoBO) importJobList.get(tableName);
}
/**
* 取得默认的导入表操作类实例
* @return ImportAction
*/
public static ImportTableInfoBO getDefaultImportAction() {
try {
//取得节点值
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new File(configFileName));
Element eroot = (Element) doc.getElementsByTagName("root").item(0);
String defaultImport = eroot.getElementsByTagName("DefaultImport").item(0).getFirstChild().getNodeValue();
System.out.println("DefaultImport:" + defaultImport);
return (ImportTableInfoBO) importJobList.get(defaultImport);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 根据表名返回实例(表列表信息)
* @param tableName String
* @return ImportAction
*/
public static String getDealClass(String className) {
return (String) dealClassList.get(className);
}
public static void main(String args[]) {
new FileImportInitFactory().init();
}
}
二、保存配置文件中的信息类
package fileimport;
/**
* 配置文件中对应一张表的导入信息,表名、列名、列数据类型
* @author
* @version 1.0
*/
public class ImportTableInfoBO{
private String tableName;
private String columnNamesFile[][] = null;
private String columnNamesCode[][] = null;
public String[][] getColumnNamesFile() {
return this.columnNamesFile;
}
public void setColumnNamesFile(String[][] columnNamesFile) {
this.columnNamesFile = columnNamesFile;
}
public void setColumnNamesCode(String[][] columnNamesCode) {
this.columnNamesCode = columnNamesCode;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public String[][] getColumnNamesCode() {
return this.columnNamesCode;
}
public String getTableName() {
return tableName;
}
}
三、导入主入口程序
package fileimport;
import java.io.FileNotFoundException;
import java.io.FileReader;
import au.com.bytecode.opencsv.CSVReader;
import java.util.HashMap;
/**
* 逐行读取文件内容,
prepareSQL(importTableInfoBO, tableName);
}
//---------------------------------------------------------------------------
//如果接口实现类未实例化,则根据setDealClass()方法设置的处理类名进行实例化
if (imp == null) {
try {
imp = (FileImportInterface) Class.forName(dealClass).newInstance();
//imp = (FileImportInterface)new ImportDirectImpl();
//System.out.println("ImportDirectImpl:" + imp);
//nextLine数组内对象均为String类型,处理前需要对nextLine进行:String、Number、Date判断,并转换
//convert(columnValues);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
//执行数据库插入操作------------------------------------------------------------
imp.insert(nextLine, sql, aHashMap,importTableInfoBO);
}
/**
* 生成预处理SQL语句,例如 -- insert into emp(ID,NAME)values(?,?)
* @param columnNamesFile String[][] 插入表中列名数组
* @param tableName String 插入目标表名
*/
public void prepareSQL(ImportTableInfoBO importTableInfoBO,String tableName) {
// this.tableName = tableName;
// this.columnNamesFile = columnNamesFile;
String[][] columnNamesFile = importTableInfoBO.getColumnNamesFile();
String[][] columnNamesCode = importTableInfoBO.getColumnNamesCode();
int fileColumnLen = columnNamesFile.length;
int codeColumnLen = 0;
if (columnNamesCode != null)
codeColumnLen = columnNamesCode.length;
StringBuffer sqlBuff = new StringBuffer(200);
//拼装PreparedStatement使用SQL语句------------------------------
sqlBuff.append("insert into " + tableName + "(");
int i = 0;
//文件与表匹配的列名
for (i = 0; i < fileColumnLen - 1; i++) {
sqlBuff.append(columnNamesFile[i][0]);
sqlBuff.append(",");
}
sqlBuff.append(columnNamesFile[i][0]);
//需特殊处理的列名
if (columnNamesCode != null){
sqlBuff.append(",");
for (i = 0; i < codeColumnLen - 1; i++) {
sqlBuff.append(columnNamesCode[i][0]);
sqlBuff.append(",");
}
sqlBuff.append(columnNamesCode[i][0]);
}
sqlBuff.append(")values(");
//列值?
for (i = 0; i < fileColumnLen + codeColumnLen - 1; i++) {
sqlBuff.append("?,");
}
sqlBuff.append("?)");
sql = sqlBuff.toString();
System.out.println(sql);
//log.debug("sql:"+sql);
}
/**
* 释放数据库连接并提交
*/
public void close() {
if (imp != null) {
imp.close();
}
}
}
五、插入数据库操作需实现的接口
package fileimport;
import java.util.HashMap;
/**
* @version 1.0
*/
public interface FileImportInterface {
public void insert(Object[] nextLine,String tableName,HashMap aHashMap,ImportTableInfoBO importTableInfoBO);
public void close();
}
六、直接导入到表程序
package fileimport;
import org.apache.commons.dbutils.QueryRunner;
import java.sql.Connection;
import java.util.HashMap;
import org.apache.commons.dbutils.DbUtils;
import java.sql.SQLException;
import java.sql.DriverManager;
import java.util.Date;
import java.text.SimpleDateFormat;
/**
* 直接导入到表中,不做特殊处理.
* 如需特殊处理,可实现接口FileImportInterface,改造insert方法即可
* @author lihf
* @version 1.0
*/
public class ImportDirectImpl implements FileImportInterface {
QueryRunner qRunner;
private long maxCommitNumber = 5000;
private long insertNum = 1; //已插入但未提交的数据数量
Connection conn = null;
public ImportDirectImpl() {
qRunner = new QueryRunner();
if (conn == null) {
try {
long l1 = System.currentTimeMillis();
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:user/pwd@127.0.0.1:1521:dbsid", "user", "pwd");
conn.setAutoCommit(false);
long l2 = System.currentTimeMillis();
System.out.println("connect db time:"+(l2 -
/**
* 文件和表列完全匹配,没有任何处理直接入库
* @param columnValues 文件对应表中列名及类型二维数组
* @param sql 预处理SQL语句
* @param aHashMap 扩展用,需特殊处理时置入变量
* @param importTableInfoBO 保存导入目标表的名称、字段名、类型等信息的BO
* @throws Exception
*/
public void insert(Object[] columnValues, String sql, HashMap aHashMap,ImportTableInfoBO importTableInfoBO) {
String dateFormat = null;
Object[] columnValuesInsert = new Object[columnValues.length];
//日期型数据处理-----------------------------------------------------------------
if (aHashMap != null){
dateFormat = (String) aHashMap.get("DateFormat");
//System.out.println("dateFormat:" + dateFormat);
//System.out.println("importTableInfoBO:" + importTableInfoBO);
}
if (importTableInfoBO != null) {
String[][] columnList = importTableInfoBO.getColumnNamesFile();
//System.out.println("columnList.length:"+columnList.length);
for (int i = 0; i < columnList.length; i++) {
String dataType = columnList[i][1];
if (dataType.equalsIgnoreCase("Date")) {
Date d = formatDate(((String)columnValues[i]), dateFormat);
//System.out.println("d:"+d);
java.sql.Date sd = new java.sql.Date(d.getTime());
columnValuesInsert[i] = (Object)sd;
}else{
columnValuesInsert[i] = (Object) columnValues[i];
//System.out.println("columnValuesInsert["+i+"]:"+columnValuesInsert[i]);
}
}
}
//-----------------------------------------------------------------------------
try {
//System.out.println("columnValuesInsert.length:"+columnValuesInsert.length);
int result = qRunner.update(conn, sql, columnValuesInsert);
if (result > 0) {
//log.debug("第"+(insertNum)+"条数据插入成功!");
//System.out.println("第"+(insertNum)+"条数据插入成功!");
if (insertNum >= maxCommitNumber) { //WIASystemConfig.getInstance().getLong("5000")
conn.commit();
//log.info(insertNum+" numbers committed succeed...insertNum归零");
//System.out.println(insertNum+" numbers committed succeed...insertNum归零");
insertNum = 1;
} else {
insertNum++;
}
}
} catch (Exception e) {
e.printStackTrace();
//---写入数据库待加入----
//log.error(e.getMessage());
}
}
public void close() {
if (conn != null) {
try {
if (conn != null) {
DbUtils.commitAndClose(conn);
System.out.println("close end");
}
} catch (SQLException e) {
e.printStackTrace();
//log.error(e.getCause());
}
}
}
/**
*
* @param dateString String
* @param format String
* @return Date
*/
public Date formatDate(String dateString,String format){
try{
SimpleDateFormat f = new SimpleDateFormat(format);
return f.parse(dateString);
}catch(Exception e){
return null;
}
}
}
七、某些列需特殊处理后插入程序
package fileimport;
import org.apache.commons.dbutils.QueryRunner;
import java.sql.Connection;
import java.util.HashMap;
import org.apache.commons.dbutils.DbUtils;
import java.sql.SQLException;
import java.sql.DriverManager;
import java.util.Date;
import java.text.SimpleDateFormat;
l1));
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
相关推荐
基于OO4O和VC 6.0 实现Oracle数据库操作C++源代码程序小实例visual studio.net
订单数据数据集tmall_order_report.csv
数据挖掘、数据统计、数据库应用甚至练习表格操作均可,CSV格式绿色环保,可转文本可转表格,易于操作,4.2w条数据,来源于生活,更便于统计,更容易发现数据规律(我自己只找过两三个指标)。 数据字段:顾客编号 ...
第四届工业大数据创新竞赛-水电站入库流量预测 成绩排名: 初赛线上第一段2月份25.4分,第二段最高分10.0分,第三段不好意思说,可看文章末尾我的提交结果记录,第一次9月8号提交第六名,当时开心的要死,之后排名...
爬取股票信息(4月9日,股票涨停股池信息)所生成的csv文件,用于学习数据分析使用,删去了 ‘涨停统计’ 和‘加自选’ 列,‘炸板次数’ 为0次的将数据变为了nan,用于数据分析中的nan值处理使用
该数据集中包含三个文件:LC.csv LP.csv LCIS.csv LC数据集为标的特征表,每只标一条记录。共有21个字段,包括一个主键、7个标本身的信息字段、13个 成交时借款人的信息字段。 LP数据集为标的还款计划和还款记录表...
五、备份后的数据可以按照设定定期删除(可选择保留n天的数据及选择保留固定几日的数据如保留每月10、20、30号的数据) 六、支持多个Oracle数据库版本:ORACLE8i、9i、 10g(已经有多个客户使用案例) 七、系统为托盘...
SAS 信用卡 UCI数据 数据集信息 此数据集包含有关2005年4月至2005年9月台湾地区信用卡客户的默认付款,...PAY_6:2005年4月的还款状态(与上述相同) BILL_AMT1:2005年9月的帐单金额(新台币) BILL_AMT2:2005年
Oracle/MSSQL 对称/不对称 导入 并且导入时: 可以转换编码(Big5/GBK) 可以替换字段内容 更可以不导入数据库,只导出为SQL(Insert)语句,等功能 ----------------------------------------------- 大小: 122880 ...
全球截止到4月19日的新型冠状肺炎确诊数据。转载自https://github.com/CSSEGISandData/COVID-19/tree/master/csse_covid_19_data/csse_covid_19_time_series
Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...
Oracle数据库教程详解大全.doc SUN 2008 初 10 亿美元收购 MySQL Oracle 2009 年 4 月 74 亿美元收购 SUN Sun 与 Oracle 合并的未来
序号,星座,开始月日,结束月日,Unicode 1,水瓶座,120,218,9810 2,双鱼座,219,320,9811 3,白羊座,321,419,9800 4,金牛座,420,520,9801 5,双子座,521,621,9802 6,巨蟹座,622,722,9803 7,狮子座,723,822,9804 8,...
③:软件统计的对象为:*.java,*.c,*.h,*.cpp,*.vb,*.jsp,*.asp,*.asps,*.html,*.htm。对php文件没 有统计,因为没有做过php页面,不知道注释是什么样的。如果谁有需要,可以通知我。 ④:软件统计完成后,如果...
此数据集包含2005年4月至2005年9月台湾地区的信用卡用户的默认付款,人口统计因素,信用数据,付款时间和账单的详细信息。
6月27日学院又获得第二批学生成绩明细表文件,格式同上述一样,第二批学生人数为30人,现在需要将两份文件学生按照总分大小从高分到低分排序,并且写入下列文件student.txt中或者数据库表中: 表二 由于软件工程专业...
VC++中利用OO4O接口从Oracle数据库中读写图像C++源代码程序小实例visual studio.net
SYSTEM表空间主要用于存储数据库的数据字典、PL/SQL程序的源代码和解释代码、数据库对象的定义。撤销表空间专门进行回退信息的自动管理。临时表空间是专门进行临时段管理的表空间。用户表空间用于分离不同应用的数据...
自己写的数据库装载工具,平时工作中用于装载大文本文件到数据库表,也能直接装载excel,不过excel只能使用第一个sheet,且不支持合并的单元格。 jdk要求版本1.6及以上。 使用方法: java -jar lynload.jar,即可看到...