`
gaobo424
  • 浏览: 16515 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

读取txt文件并导入Oracle数据库

阅读更多
  最近按客户需求实现了核心与业务系统数据导入功能。核心系统生成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;
}
}
分享到:
评论

相关推荐

    用java编程将txt文件数据导入oracle

    "Java编程将TXT文件数据导入Oracle数据库" Java 编程将 TXT 文件数据导入 Oracle 数据库是指使用 Java 语言编写程序将 TXT 文件中的数据导入 Oracle 数据库中,以方便进行计算、统计等操作。下面将详细介绍该知识...

    如何通过txt文件批量导入数据到oracle数据库

    因此,我们需要掌握如何通过TXT文件批量导入数据到Oracle数据库的方法。下面,我们将详细介绍这一过程。 首先,我们需要了解TXT文件的数据格式。通常,TXT文件中的数据是以特定分隔符(如逗号、制表符等)区分各个...

    Txt文件导入oracle数据库方法

    ### Txt文件导入Oracle数据库方法详解 在日常的IT工作流程中,数据的迁移与整合是一项常见且关键的任务。尤其在处理大数据量时,从文本格式如txt或csv文件导入数据至Oracle数据库的需求尤为频繁。本文将详细介绍两...

    用plsql将mdb文件导入到oracle数据库中

    本文旨在详细介绍如何使用PL/SQL将MDB文件(Microsoft Access数据库)导入到Oracle数据库中的过程及相关技术点。 ### 一、概述 标题与描述都明确指出了本篇文章的核心内容:利用PL/SQL进行MDB文件向Oracle数据库的...

    图片批量导入oracle数据库

    总之,批量导入图片到Oracle数据库是一项涉及到Java编程、JDBC连接、SQL操作以及文件处理的任务。掌握这些技能对于处理大量图片数据的数据库应用至关重要,无论是Web应用、数据分析还是其他领域。通过理解和实践,你...

    导入txt文件到oracle数据库

    在IT行业中,数据库管理...总的来说,将TXT文件数据导入Oracle数据库是一项常见的数据处理任务,涉及到文件流的读取、字符串的截取以及Map数据结构的应用。熟练掌握这些技能,将有助于在日常工作中高效地处理大量数据。

    C# 通过oracle sqlldr 将TXT批量导入oracle

    C# 通过oracle sqlldr 将TXT批量导入oracle 一个文件夹里有大量的TXT文件,以"~"区分各字段. 这个程序能批量将此文件夹里的所有的文件导入oralce 并按日期把已导入的TXT文件复制另一个文件夹

    Excel导入Oracle数据库关键代码

    `ExcelImportDataBaseSpringDao`可能是定义了一个接口,包含了一些方法,如`importExcelToOracle(List&lt;DataRow&gt; rows)`,用于接收从Excel读取的数据行,并将其导入Oracle数据库。 3. **连接Oracle数据库**:Java中...

    利用GDAL2.1.2库 把shp文件导入 oracle数据库中 例子

    本文将深入探讨如何利用GDAL 2.1.2版本将Shapefile(SHP)文件导入Oracle数据库,以及这一过程中的关键知识点。 首先,GDAL是一个C++库,它提供了一系列API来读取、写入和处理地理空间数据。GDAL 2.1.2版本包含了对...

    Ecxel数据导入Oracle 数据库中

    总结来说,Excel数据导入Oracle数据库涉及到的主要知识点包括: 1. Excel文件格式和数据结构的理解。 2. Oracle数据库的基础知识,如SQL语法、JDBC驱动的使用。 3. 编程语言(如Java或Python)处理文件和数据库操作...

    java 读取txt数据并保存到数据库中源代码

    java 读取txt文本文件中的数据并保存到数据库中源代码,假设txt已有格式,并以","分隔。其中的sql包需要自己去微软官网下载。

    excel批量导入oracle数据库

    在实际操作中,`excel批量导入oracle数据库.txt`可能包含了具体的代码示例或详细步骤,供用户参考。确保遵循文件中的指导,同时结合上述理论知识,可以顺利完成Excel到Oracle的批量导入工作。 总之,批量导入Excel...

    oracle数据库导入数据以及创建用户

    本文将深入探讨如何导入数据到Oracle数据库以及创建新用户,这对于数据库管理员和开发者来说是至关重要的技能。以下是对标题"Oracle数据库导入数据以及创建用户"的详细解读: 1. 数据导入: - **SQL*Loader**:...

    轻松将Excel的xls格式文件导入到Oracle数据库

    本文将详细阐述如何轻松地将Excel的xls格式文件导入到Oracle数据库。 首先,理解Oracle数据库。Oracle是一种关系型数据库管理系统(RDBMS),它提供了丰富的数据存储、管理、查询和分析功能。在企业级应用中,...

    excel导入oracle数据库

    总的来说,“Excel导入Oracle数据库”项目提供了从Excel文件向Oracle数据库导入数据的实用工具。这涉及到文件读取、数据库连接、数据映射以及数据导入等多个步骤,对于需要频繁进行此类操作的用户来说,能显著提高...

    JAVA实现Excel表数据导入ORACLE数据库.txt

    ### JAVA实现Excel表数据导入ORACLE数据库 #### 知识点概述 本文将详细介绍如何使用Java编程语言将Excel表格中的数据导入到Oracle数据库中。这一过程涉及到的关键技术包括:使用JDBC连接Oracle数据库、通过ODBC...

    读取.xls、.dbf文件信息并录入oracle数据库

    Oracle数据库以其强大的功能和稳定性在企业级应用中占有一席之地,因此掌握如何将这些外部数据源的数据导入Oracle数据库是一项关键技能。 首先,让我们详细了解`.xls`和`.dbf`文件。`.xls`文件是Microsoft Excel的...

    gradle导入本地oracle包连接数据库

    本文将详细讲解如何使用Gradle构建工具来导入本地的Oracle JAR包,以便于我们的项目能顺利连接到Oracle数据库。我们将主要关注两个文件:`ojdbc6.jar` 和一个名为 `JDBCDemo` 的示例应用。 首先,让我们了解`ojdbc6...

    文件批量导入数据到oracle数据库

    首先,"文件批量导入数据到Oracle数据库"指的是将一个或多个文本文件(例如CSV、TXT格式)中的数据一次性加载到Oracle数据库的表中。这种操作可以极大地提高效率,尤其是在处理大量数据时,比逐条插入更有效率。常用...

    SQL Server导入Oracle数据库

    总之,从SQL Server导入Oracle数据库的过程涉及多个环节,包括数据导出、转换、导入、连接管理以及性能和安全性考虑。了解这些步骤并根据具体需求进行定制,是成功完成数据迁移的关键。在实际操作中,应根据项目规模...

Global site tag (gtag.js) - Google Analytics