簡體   English   中英

使用Java將CSV文件導入到Oracle數據庫

[英]importing a csv file into oracle database using java

我收到以下錯誤

  Java.lang.ArrayIndexOutOfBoundsException: 0
  at oracle.jdbc.driver.OracleSql.main(OracleSql.java:1614)

我正在使用eclipse indigo和oracle 10g。我該如何解決此問題。有人可以幫助我嗎?

我想將一個csv文件加載到oracle數據庫中。.我創建了一個名為zt的表,該表具有三列(id,s_date,data)。CSV數據包含以下內容:

   a1,2015-04-15 17:40:20.0,18.5786    
   a2,2015-04-15 16:20:59.0,16.7868   
   a3,2015-03-15 16:20:59.0,16.51689    
   a4,2015-04-16 16:20:55.0,24.789028  
   a5,2015-02-15 17:55:59.0,28.784145 

import java.io.FileReader;    
import java.sql.Connection;    
import java.sql.DriverManager;    
import java.sql.PreparedStatement;
import java.sql.Statement;
import au.com.bytecode.opencsv.CSVReader;

public class ImportTest {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        readCsv();
    }

    public static void readCsv() {
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            Connection conn     =DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/xe","system","arry");
            PreparedStatement pstmt =conn.prepareStatement("Insert into zt values(?,?,?)");

            CSVReader reader = new CSVReader(new FileReader("D:\\zzzzzzzz.csv"), ','); 
            String[] nextLine;
            int i = 0;
            while((nextLine = reader.readNext()) != null) {
                i++;
                pstmt.setString(1,nextLine[0]);
                pstmt.setString(2,nextLine[1]);
                pstmt.setDouble(3,Double.parseDouble(nextLine[2]));
            }

            pstmt.close();
            conn.commit();
            conn.close();
        } catch(Exception e) {
            e.printStackTrace();       
        }
    }
}

那很簡單。 您正在使用CSVReader並使用逗號(',')作為字段分隔符,但是您向我們展示的4個示例行不包含任何逗號。

這樣的行'a1 2015-04-15 17:40:20.0 18.5786'分割為','將只是包含整個行的1個字符串。

嚴格來講,您的文件不是CSV文件。

對於初學者來說

pstmt.setString(1,nextLine[0]);
pstmt.setString(1,nextLine[1]);
pstmt.setDouble(2,Double.parseDouble(nextLine[2]))

請注意,您重復了兩次參數一,如果數據庫發出異常,則很可能是原因。

更多

Java中的IndexOutOfBoundsException是運行時異常。如文檔中所述

表示某種索引(例如,數組,字符串或向量)的索引超出范圍。 應用程序可以將該類作為子類來指示類似的異常。

顯然,您無需先檢查即可訪問數組的索引。 總是很危險的事情。

我也同意,您的CSV文件似乎不正確,但是您遇到的任何問題都不僅限於此,您應該對此加以防范。 我添加了代碼以顯示基本的防護措施

只需在您的while循環中檢查長度,如下所示

 while((nextLine = reader.readNext()) != null){
             i++;
                // Remember length 3 = index 2
                if (nextLine.length == 3){
                    pstmt.setString(1,nextLine[0]);
                    //I have changed it to 2 from 1 
                    pstmt.setString(2,nextLine[1]);
                    pstmt.setDouble(2,Double.parseDouble(nextLine[2]));
             }
    }

似乎您正在嘗試在Oracle JDBC驅動程序JAR而不是代碼中運行類。

Oracle JDBC JAR確實包含一個類oracle.jdbc.driver.OracleSql ,並且該類具有main方法,因此可以運行該類,但是我認為這不是您想要的。

重現此錯誤,提供或采用其他行號的方法如下:

C:\>java -cp ojdbc14.jar oracle.jdbc.driver.OracleSql
java.lang.ArrayIndexOutOfBoundsException: 0
    at oracle.jdbc.driver.OracleSql.main(OracleSql.java:1717)

這是完整的輸出:我沒有截斷stacktrace。

我無法使用比ojdbc14.jar更新的JDBC JAR版本重現此行為:我收到了一條用法消息,而不是嘗試對ojdbc5.jar,ojdbc6.jar和ojdbc7.jar進行相同的操作。 上面的異常stacktrace暗示ojdbc14.jar在嘗試使用命令行參數之前無法檢查其數量,而更高版本修復了此缺陷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM