使用 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.how 我可以解决这个问题 problem.can 谁能帮助我?
我想将一个 csv 文件加载到 oracle 数据库中..
我创建了一个名为 zt 的 table 三列 (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]))
请注意,您已将第一个参数重复两次,如果异常来自数据库,那么这很可能就是原因。
更多
IndexOutOfBoundsException in Java 是运行时异常。如文档中所述
Thrown to indicate that an index of some sort (such as to an array, to
a string, or to a vector) is out of range. Applications can subclass
this class to indicate similar exceptions.
很明显,您没有先检查就访问了数组的索引。总是一件危险的事情。
我也同意,您的 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 中 运行 一个 class 而不是您的代码。
Oracle JDBC JAR 确实包含一个 class oracle.jdbc.driver.OracleSql
,而这个 class 有一个 main
方法,所以可以 运行 这个 class,但我认为这不是你想要做的。
重现此错误的方法如下,提供或采用不同的行号:
C:\>java -cp ojdbc14.jar oracle.jdbc.driver.OracleSql
java.lang.ArrayIndexOutOfBoundsException: 0
at oracle.jdbc.driver.OracleSql.main(OracleSql.java:1717)
这是完整的输出:我还没有运行处理堆栈跟踪。
我无法使用比 ojdbc14.jar 更新的 JDBC JAR 版本重现此行为:我收到一条用法消息,而不是尝试使用 ojdbc5.jar、ojdbc6.jar 和 ojdbc7.jar。上面的异常堆栈跟踪表明 ojdbc14.jar 在尝试使用它们之前未能检查命令行参数的数量,而更高版本修复了此缺陷。
我收到以下错误
Java.lang.ArrayIndexOutOfBoundsException: 0
at oracle.jdbc.driver.OracleSql.main(OracleSql.java:1614)
我正在使用 eclipse indigo 和 oracle 10g.how 我可以解决这个问题 problem.can 谁能帮助我?
我想将一个 csv 文件加载到 oracle 数据库中.. 我创建了一个名为 zt 的 table 三列 (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]))
请注意,您已将第一个参数重复两次,如果异常来自数据库,那么这很可能就是原因。
更多
IndexOutOfBoundsException in Java 是运行时异常。如文档中所述
Thrown to indicate that an index of some sort (such as to an array, to a string, or to a vector) is out of range. Applications can subclass this class to indicate similar exceptions.
很明显,您没有先检查就访问了数组的索引。总是一件危险的事情。
我也同意,您的 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 中 运行 一个 class 而不是您的代码。
Oracle JDBC JAR 确实包含一个 class oracle.jdbc.driver.OracleSql
,而这个 class 有一个 main
方法,所以可以 运行 这个 class,但我认为这不是你想要做的。
重现此错误的方法如下,提供或采用不同的行号:
C:\>java -cp ojdbc14.jar oracle.jdbc.driver.OracleSql
java.lang.ArrayIndexOutOfBoundsException: 0
at oracle.jdbc.driver.OracleSql.main(OracleSql.java:1717)
这是完整的输出:我还没有运行处理堆栈跟踪。
我无法使用比 ojdbc14.jar 更新的 JDBC JAR 版本重现此行为:我收到一条用法消息,而不是尝试使用 ojdbc5.jar、ojdbc6.jar 和 ojdbc7.jar。上面的异常堆栈跟踪表明 ojdbc14.jar 在尝试使用它们之前未能检查命令行参数的数量,而更高版本修复了此缺陷。