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

    xiaoxiao2021-12-14  19

    把数据从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(); //注意:此处非常有必要!如果不关闭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");

           }

    }

    ———————————————————————结束!

    转载请注明原文地址: https://ju.6miu.com/read-963686.html

    最新回复(0)