您的位置:首页 > 数据库

把数据从txt文本文件导入到数据库的实现方法

2016-12-02 13:38 806 查看
 把数据从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)。

    可以用两种方式实现。先说简单的:

一、利用Oracle自带的 SQL*Loader工具。

步骤:

    1.建立一个控制文件input.ctl,不妨置于C盘根目录。其内容如下:

 LOAD DATA

INFILE  'C:\dbo_M_CHTH.txt'

INTO TABLE RPS.RPP_CONV_TEST0

FIELDS TERMINATED BY ","

(BP_CD,TH_CD)
    2.运行CMD命令,输入如下命令行,并回车执行:
sqlldr  userid=rps/rps@RPPBJ control
=c:\input.ctl
其中:     

sqlldr  userid=用户名/密码@数据库服务名称 control
=绝对路径、文件名
    具体执行结果可以查看自动生成的Log记录文件。不再赘述。
二、写Java应用程序。
索性先把我的代码和注释全贴出来,如下:

package jp.co.ricoh;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileReader;

import java.sql.Connection;

import java.sql.PreparedStatement;

public class CodeChange {

 

 public static void txtToDB(String file_path_name) throws Exception {

  String file_nameTag=""; 

  String table_name = "";

  String filed1 = "";

  String filed2 = "";

  String filed_content = "";

 

  boolean isFistLine = true;

  int count_num=0;        //写Log时,显示的处理成功的记录件数。

  Connection db =null;    // New一个连接对象db。

  PreparedStatement stmt = null;

  PreparedStatement stmt1 = null;

 

  LogWriter Errlog = new LogWriter(true);   //LogWriter:写Log的函数。

     LogWriter InfLog = new LogWriter();

     InfLog.WriteLog("  コード変換が開始, ファイル名: "

       + file_path_name+ "。",true);     

     // -------开始处理数据。
 try {   

   db= new DBConnection().getConnection(); //一定要写在try内,以捕捉异常
   File file = new File(file_path_name); //File 类提供了一种抽象方式,

//以便以与机器无关的方式处理机器相关情况下有关文件和路径名。

   BufferedReader buffer = new BufferedReader(new FileReader(file));

//此处利用BufferedReader,从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

//dbo_M_CHTH.txt --->表:RPP_CONV_TH;dbo_M_CHTH.txt
--->表:RPP_CONV_TH

//以下12行,只是据客户要求,对这两个txt文件,区分对应要插入的表和字段名。

   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";

    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;

   //注意,此处不要用 TRANCATE TABLE ,太危险,无法回滚。   

   stmt = db.prepareStatement(sqlClearTable);

   stmt.executeUpdate();

 // executeUpdate()适用于删、插,如果单纯查询,可以用 stmt.execute()。 
   stmt.close(); //注意:此处非常有必
eca2
要!如果不关闭prepareStatement ,

    //就只能最大开299个线程,如果你的表记录条数超过300,也只能插入299条。

//为提高效率,应尽量避免把prepareStatement对象写在循环内部频繁操作。

   while ((filed_content = buffer.readLine()) != null) {

    if (!isFistLine) {                        //排除第一行,不插入。 

     String[] str = filed_content.split(","); //据txt文件内的逗号解析。
     if (str == null) {

      continue;    //逐行的读完为止。
     }

     String sqlInsert = "  INSERT INTO "

          + table_name

          + "( "+ filed1 + "," + filed2 + " )"

          + "  VALUES"

          + " ('" + str[0] + "' , '" + str[1] + "' ) ";    

      stmt1 = db.prepareStatement(sqlInsert);     

      stmt1.executeUpdate();

     stmt1.close(); //注意及时关闭prepareStatement。
     count_num++;   //插入数据成功次数,每次自增。
    } else {

     isFistLine = false; 

    }

   }

   db.commit();  // 别忘了提交!

   db.close();     //把该关闭的连接关闭。

   buffer.close();  

   InfLog.WriteLog("  コード変換が正常終了,ファイル名:" + file_path_name +", " + count_num + "件レコードを処理されました。" ,true);

         InfLog.Release();

         Errlog.Release();        

  } catch (Exception e) {

   e.printStackTrace();  
   Errlog.WriteLog("  コード変換が異常終了,ファイル名:"+ file_path_name + ";" +"エラーメッセージ:"+ e.getMessage()+
"。" , true);

   InfLog.WriteLog("  コード変換が異常終了,ファイル名:" + file_path_name + ","+ count_num + "件レコードを処理されました。", true);

         InfLog.Release();

         Errlog.Release();        

   if (db != null) {   //出异常情况下,非空的连接也要关闭。 
    db.rollback();     //数据库回滚
    db.close();

   }        

  }

 }

 

 public static void main(String[] args) throws Exception {

  String txtFileName="";

  String txtFilePath="";

  CONFReader.init();

  

  txtFilePath=CONFReader.getTxtPath();//得到文件路径。

  txtFileName= CONFReader.getTxtFILENAME_CHTH();

               //得到txt文件名dbo_M_CHTH.txt --->表:RPP_CONV_TH
  txtToDB( txtFilePath + txtFileName );//调用函数,开始处理。
  txtFileName= CONFReader.getTxtFILENAME_CHTS();

              //得到txt文件名dbo_M_CHTS.txt --->表:RPP_CONV_TS

  txtToDB( txtFilePath + txtFileName );

 }

}

××××××××××××××××××××××××××××××××××××

 

CONF.PROPERTY中文件路径的配置:

TXTPATH=txt/

txtFILENAME_CHTH=dbo_M_CHTH.txt

txtFILENAME_CHTS=dbo_M_CHTS.txt

××××××××××××××××××××××××××××××××××××

调用CONFReader.java 中的部分:

package jp.co.ricoh; 

import java.util.*;

import java.io.*;

 

final public class CONFReader{

       //デフォールトプロパティーファイル

       private static String CONFIG_FILE = "./CONF.PROPERTY";

       //private static ExProperties propConfig = null;

       private static Properties propConfig = null;

 

      private CONFReader(){

       }

      

       public static void init(){

              propConfig = new Properties();

              try{

                     FileInputStream isConfigFile = new FileInputStream(CONFIG_FILE);

                     propConfig.load(isConfigFile);

                     isConfigFile.close();

              }

              catch(Exception ex){

                     ex.printStackTrace();

              }

       }

………

       

       public static String getTxtPath(){

              return getValue("TXTPATH");

       }

      

      

       public static String getTxtFILENAME_CHTH(){

              return getValue("txtFILENAME_CHTH");

       }

      

      

       public static String getTxtFILENAME_CHTS(){

              return getValue("txtFILENAME_CHTS");

       }

}

———————————————————————结束!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 数据库 TXT