[英]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.