把数据从txt文件导入到数据库的实现方法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
+ " VALUES"
+ " ('" + str[0] + "' , '" + str[1] + "' ) ";
stmt1 = db.prepareStatement(sqlInsert);
stmt1.executeUpdate();
stmt1.close(); //注意及时关闭prepareStatement。
//就只能最大开299个线程,如果你的表记录条数超过300,也只能插入299条。
//为提高效率,应尽量避免把prepareStatement对象写在循环内部频繁操作。
while ((filed_content = buffer.readLine()) != null) {
if (!isFistLine) { //排除第一行,不插入。
count_num++; //插入数据成功次数,每次自增。
} else {
isFistLine = false;
}
}
db.commit(); //别忘了提交!
db.close(); //把该关闭的连接关闭。
buffer.close();
InfLog.WriteLog("コード変換が正常終了,ファイル名:" + file_path_name +"," + count_num + "件レコードを処理されました。" ,true);
LogWriter InfLog = new LogWriter();
InfLog.WriteLog("コード変換が開始,ファイル名: "
+ file_path_name+ "。",true);
// -------开始处理数据。
try {
db= new DBConnection().getConnection(); //一定要写在try内,以捕捉异常
db.rollback(); //数据库回滚
db.close();
}
}
}
public static void main(String[] args) throws Exception {
String txtFileName="";
String txtFilePath="";
CONFReader.init();
InfLog.Release();
Errlog.Release();
} catch (Exception e) {
e.printStackTrace();
Errlog.WriteLog("コード変換が異常終了,ファイル名:"+ file_path_name + ";" +"エラーメッセージ:"+ e.getMessage()+ "。" , true);
//private static ExProperties propConfig = null;
private static Properties propConfig = null;
private CONFReader(){
}
public static void init(){
propConfig = new Properties();
}
}ຫໍສະໝຸດ Baidu
………
public static String getTxtPath(){
return getValue("TXTPATH");
}
public static String getTxtFILENAME_CHTH(){
return getValue("txtFILENAME_CHTH");
}
public static String getTxtFILENAME_CHTS(){
filed2 = "TH_CD";
} else if (file_nameTag.equals("S")) {
table_name = "RPP_CONV_TS";
filed1 = "BP_CD";
filed2 = "TS_CD";
}
String sqlClearTable = " DELETE FROM " + table_name;
CONF.PROPERTY中文件路径的配置:
TXTPATH=txt/
txtFILENAME_CHTH=dbo_M_CHTH.txt
txtFILENAME_CHTS=dbo_M_CHTS.txt
××××××××××××××××××××××××××××××××××××
调用CONFReader.java中的部分:
InfLog.WriteLog("コード変換が異常終了,ファイル名:" + file_path_name + ","+ count_num + "件レコードを処理されました。", true);
InfLog.Release();
Errlog.Release();
if (db != null) { //出异常情况下,非空的连接也要关闭。
(BP_CD,TH_CD)
2.运行CMD命令,输入如下命令行,并回车执行:
sqlldr userid=rps/rps@RPPBJ control =c:\input.ctl
其中:
sqlldr userid=用户名/密码@数据库服务名称control =绝对路径、文件名
具体执行结果可以查看自动生成的Log记录文件。不再赘述。
String[] str = filed_content.split(","); //据txt文件内的逗号解析。
if (str == null) {
continue; //逐行的读完为止。
}
String sqlInsert = " INSERT INTO "
+ table_name
+ "( "+ filed1 + "," + filed2 + " )"
Connection db =null; // New一个连接对象db。
PreparedStatement stmt = null;
PreparedStatement stmt1 = null;
LogWriter Errlog = new LogWriter(true); //LogWriter:写Log的函数。
return getValue("txtFILENAME_CHTS");
}
}
———————————————————————结束!
可以用两种方式实现。先说简单的:
一、利用Oracle自带的SQL*Loader工具。
步骤:
1.建立一个控制文件input.ctl,不妨置于C盘根目录。其内容如下:
LOAD DATA
INFILE 'C:\dbo_M_CHTH.txt'
INTO TABLE RPS.RPP_CONV_TEST0
FIELDS TERMINATED BY ","
二、写Java应用程序。
索性先把我的代码和注释全贴出来,如下:
package jp.co.ricoh;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.sql.Connection;
//此处利用BufferedReader,从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
//dbo_M_CHTH.txt --->表:RPP_CONV_TH;dbo_M_CHTH.txt --->表:RPP_CONV_TH
//以下12行,只是据客户要求,对这两个txt文件,区分对应要插入的表和字段名。
把数据从txt文件导入到数据库的实现方法
文本文件dbo_M_CHTH.txt,数据格式如下:
CHCDHB,CHCDTH
1011102,F671911
1011103,F691911
1011104,F681911
1011106,F601907
········
其中,第一行:CHCDHB,CHCDTH为表头名,不要求导入Oracle数据库,从第二行以下的数据导入数据库中的表:RPS.RPP_CONV_TEST0,表有两个字段:(BP_CD,TH_CD)。
txtFilePath=CONFReader.getTxtPath();//得到文件路径。
txtFileName= CONFReader.getTxtFILENAME_CHTH();
//得到txt文件名dbo_M_CHTH.txt --->表:RPP_CONV_TH
txtToDB( txtFilePath + txtFileName );//调用函数,开始处理。
File file = new File(file_path_name); //File类提供了一种抽象方式,
//以便以与机器无关的方式处理机器相关情况下有关文件和路径名。
BufferedReader buffer = new BufferedReader(new FileReader(file));
package jp.co.ricoh;
import java.util.*;
import java.io.*;
final public class CONFReader{
//デフォールトプロパティーファイル
private static String CONFIG_FILE = "./CONF.PROPERTY";
file_name=file_path_name.substring(file_path_name.length()-5, file_path_name.length()-4);
if (file_nameTag.equals("H")) {
table_name = "RPP_CONV_TH";
filed1 = "BP_CD";
txtFileName= CONFReader.getTxtFILENAME_CHTS();
//得到txt文件名dbo_M_CHTS.txt --->表:RPP_CONV_TS
txtToDB( txtFilePath + txtFileName );
}
}
××××××××××××××××××××××××××××××××××××
import java.sql.PreparedStatement;
public class CodeChange {
public static void txtToDB(String file_path_name) throws Exception {
String file_nameTag="";
try{
FileInputStream isConfigFile = new FileInputStream(CONFIG_FILE);
propConfig.load(isConfigFile);
isConfigFile.close();
}
catch(Exception ex){
ex.printStackTrace();
String table_name = "";
String filed1 = "";
String filed2 = "";
String filed_content = "";
boolean isFistLine = true;
int count_num=0; //写Log时,显示的处理成功的记录件数。
//注意,此处不要用TRANCATE TABLE,太危险,无法回滚。
stmt = db.prepareStatement(sqlClearTable);
stmt.executeUpdate();
// executeUpdate()适用于删、插,如果单纯查询,可以用stmt.execute()。
stmt.close(); //注意:此处非常有必要!如果不关闭prepareStatement,
+ " ('" + str[0] + "' , '" + str[1] + "' ) ";
stmt1 = db.prepareStatement(sqlInsert);
stmt1.executeUpdate();
stmt1.close(); //注意及时关闭prepareStatement。
//就只能最大开299个线程,如果你的表记录条数超过300,也只能插入299条。
//为提高效率,应尽量避免把prepareStatement对象写在循环内部频繁操作。
while ((filed_content = buffer.readLine()) != null) {
if (!isFistLine) { //排除第一行,不插入。
count_num++; //插入数据成功次数,每次自增。
} else {
isFistLine = false;
}
}
db.commit(); //别忘了提交!
db.close(); //把该关闭的连接关闭。
buffer.close();
InfLog.WriteLog("コード変換が正常終了,ファイル名:" + file_path_name +"," + count_num + "件レコードを処理されました。" ,true);
LogWriter InfLog = new LogWriter();
InfLog.WriteLog("コード変換が開始,ファイル名: "
+ file_path_name+ "。",true);
// -------开始处理数据。
try {
db= new DBConnection().getConnection(); //一定要写在try内,以捕捉异常
db.rollback(); //数据库回滚
db.close();
}
}
}
public static void main(String[] args) throws Exception {
String txtFileName="";
String txtFilePath="";
CONFReader.init();
InfLog.Release();
Errlog.Release();
} catch (Exception e) {
e.printStackTrace();
Errlog.WriteLog("コード変換が異常終了,ファイル名:"+ file_path_name + ";" +"エラーメッセージ:"+ e.getMessage()+ "。" , true);
//private static ExProperties propConfig = null;
private static Properties propConfig = null;
private CONFReader(){
}
public static void init(){
propConfig = new Properties();
}
}ຫໍສະໝຸດ Baidu
………
public static String getTxtPath(){
return getValue("TXTPATH");
}
public static String getTxtFILENAME_CHTH(){
return getValue("txtFILENAME_CHTH");
}
public static String getTxtFILENAME_CHTS(){
filed2 = "TH_CD";
} else if (file_nameTag.equals("S")) {
table_name = "RPP_CONV_TS";
filed1 = "BP_CD";
filed2 = "TS_CD";
}
String sqlClearTable = " DELETE FROM " + table_name;
CONF.PROPERTY中文件路径的配置:
TXTPATH=txt/
txtFILENAME_CHTH=dbo_M_CHTH.txt
txtFILENAME_CHTS=dbo_M_CHTS.txt
××××××××××××××××××××××××××××××××××××
调用CONFReader.java中的部分:
InfLog.WriteLog("コード変換が異常終了,ファイル名:" + file_path_name + ","+ count_num + "件レコードを処理されました。", true);
InfLog.Release();
Errlog.Release();
if (db != null) { //出异常情况下,非空的连接也要关闭。
(BP_CD,TH_CD)
2.运行CMD命令,输入如下命令行,并回车执行:
sqlldr userid=rps/rps@RPPBJ control =c:\input.ctl
其中:
sqlldr userid=用户名/密码@数据库服务名称control =绝对路径、文件名
具体执行结果可以查看自动生成的Log记录文件。不再赘述。
String[] str = filed_content.split(","); //据txt文件内的逗号解析。
if (str == null) {
continue; //逐行的读完为止。
}
String sqlInsert = " INSERT INTO "
+ table_name
+ "( "+ filed1 + "," + filed2 + " )"
Connection db =null; // New一个连接对象db。
PreparedStatement stmt = null;
PreparedStatement stmt1 = null;
LogWriter Errlog = new LogWriter(true); //LogWriter:写Log的函数。
return getValue("txtFILENAME_CHTS");
}
}
———————————————————————结束!
可以用两种方式实现。先说简单的:
一、利用Oracle自带的SQL*Loader工具。
步骤:
1.建立一个控制文件input.ctl,不妨置于C盘根目录。其内容如下:
LOAD DATA
INFILE 'C:\dbo_M_CHTH.txt'
INTO TABLE RPS.RPP_CONV_TEST0
FIELDS TERMINATED BY ","
二、写Java应用程序。
索性先把我的代码和注释全贴出来,如下:
package jp.co.ricoh;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.sql.Connection;
//此处利用BufferedReader,从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
//dbo_M_CHTH.txt --->表:RPP_CONV_TH;dbo_M_CHTH.txt --->表:RPP_CONV_TH
//以下12行,只是据客户要求,对这两个txt文件,区分对应要插入的表和字段名。
把数据从txt文件导入到数据库的实现方法
文本文件dbo_M_CHTH.txt,数据格式如下:
CHCDHB,CHCDTH
1011102,F671911
1011103,F691911
1011104,F681911
1011106,F601907
········
其中,第一行:CHCDHB,CHCDTH为表头名,不要求导入Oracle数据库,从第二行以下的数据导入数据库中的表:RPS.RPP_CONV_TEST0,表有两个字段:(BP_CD,TH_CD)。
txtFilePath=CONFReader.getTxtPath();//得到文件路径。
txtFileName= CONFReader.getTxtFILENAME_CHTH();
//得到txt文件名dbo_M_CHTH.txt --->表:RPP_CONV_TH
txtToDB( txtFilePath + txtFileName );//调用函数,开始处理。
File file = new File(file_path_name); //File类提供了一种抽象方式,
//以便以与机器无关的方式处理机器相关情况下有关文件和路径名。
BufferedReader buffer = new BufferedReader(new FileReader(file));
package jp.co.ricoh;
import java.util.*;
import java.io.*;
final public class CONFReader{
//デフォールトプロパティーファイル
private static String CONFIG_FILE = "./CONF.PROPERTY";
file_name=file_path_name.substring(file_path_name.length()-5, file_path_name.length()-4);
if (file_nameTag.equals("H")) {
table_name = "RPP_CONV_TH";
filed1 = "BP_CD";
txtFileName= CONFReader.getTxtFILENAME_CHTS();
//得到txt文件名dbo_M_CHTS.txt --->表:RPP_CONV_TS
txtToDB( txtFilePath + txtFileName );
}
}
××××××××××××××××××××××××××××××××××××
import java.sql.PreparedStatement;
public class CodeChange {
public static void txtToDB(String file_path_name) throws Exception {
String file_nameTag="";
try{
FileInputStream isConfigFile = new FileInputStream(CONFIG_FILE);
propConfig.load(isConfigFile);
isConfigFile.close();
}
catch(Exception ex){
ex.printStackTrace();
String table_name = "";
String filed1 = "";
String filed2 = "";
String filed_content = "";
boolean isFistLine = true;
int count_num=0; //写Log时,显示的处理成功的记录件数。
//注意,此处不要用TRANCATE TABLE,太危险,无法回滚。
stmt = db.prepareStatement(sqlClearTable);
stmt.executeUpdate();
// executeUpdate()适用于删、插,如果单纯查询,可以用stmt.execute()。
stmt.close(); //注意:此处非常有必要!如果不关闭prepareStatement,