Java 如何设置变量数组值
这里,准备好的语句应该使用数组将CSV文件中的一行数据插入到数据库行中。问题是CSV文件中的行发生了很大的变化,因此最终出现了数组越界错误,因为准备好的语句可能会调用行读取器没有的数组索引 我尝试过不同的预处理语句方法,但在这里没有一种方法能帮上忙Java 如何设置变量数组值,java,arrays,sqlite,jdbc,prepared-statement,Java,Arrays,Sqlite,Jdbc,Prepared Statement,这里,准备好的语句应该使用数组将CSV文件中的一行数据插入到数据库行中。问题是CSV文件中的行发生了很大的变化,因此最终出现了数组越界错误,因为准备好的语句可能会调用行读取器没有的数组索引 我尝试过不同的预处理语句方法,但在这里没有一种方法能帮上忙 Path p = Paths.get("ppMonthly.csv"); BufferedReader b; b = Files.newBufferedReader(p); String line = ""; while((line = b.rea
Path p = Paths.get("ppMonthly.csv");
BufferedReader b;
b = Files.newBufferedReader(p);
String line = "";
while((line = b.readLine()) !=null){
line = b.readLine();
String [] tokens = line.split(",");
PreparedStatement pstm = connection.prepareStatement("INSERT INTO PropertyPrice (SaleID,Price,Date,Post,Property,OldNew,Duration,PAON,SAON,Street,Locality,TownCity,District,County,PPD,Records) " +
"VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);");
pstm.set(1, tokens.length);
pstm.setString(2, tokens[1]);
pstm.setString(3, tokens[2]);
pstm.setString(4, tokens[3]);
pstm.setString(5, tokens[4]);
pstm.setString(6, tokens[5]);
pstm.setString(7, tokens[6]);
pstm.setString(8, tokens[7]);
pstm.setString(9, tokens[8]);
pstm.setString(10, tokens[9]);
pstm.setString(11, tokens[10]);
pstm.setString(12, tokens[11]);
pstm.setString(13, tokens[12]);
pstm.setString(14, tokens[13]);
pstm.setString(15, tokens[14]);
pstm.setString(16, tokens[16]);
答案取决于当线条不同时你想要什么 您可以检查获取的令牌数组的长度,如果它与您想要的不同,您可以跳过该行的插入,或者在无法获取的字段中放置空值。文件中的字段计数不同 如果您的意思是单个文件的字段数可能有所不同,则违反了CSV规范 第2.4节: …在整个文件中,每行应包含相同数量的字段 你应该把这些数据反馈给发布它的人。并向出版商介绍该标准。CSV是一个如此简单的想法,令人惊讶的是人们找到了多少方法来搞砸它 字段计数因文件而异 如果您的意思是文件的字段数量不同,那么我假设存在一种模式。如果一些文件有12个字段,而其他文件有16个字段,那么我希望您知道每个字段中有哪些字段。如果是这样,请读取每个文件的第一行,计算字段数,然后分支代码。在代码中有一个例程知道12字段文件的特定字段。在代码中有另一个例程,它知道16字段文件的特定字段 如果输入文件可以通过这种方式预测,我建议要求数据发布者在文件标题中包含措辞,以指示它包含哪种类型的数据。这样可以避免对字段进行采样和计数 如果您的文件不可预测,那么就没有神奇的解决方案。您可以查看文件中的示例值并猜测它们的类型,从而对列的含义进行猜测,但我认为这样做是不合理的。我会拒绝将错误数据反馈给发布者 CSV处理库 最后,我有两项建议:
- 使用库来读/写CSV,而不是自己滚动。您可以选择几个好的库。我已经成功地利用了
- 考虑将(a)读取和验证CSV数据的任务与(b)写入数据库的任务分开
java.lang.ArrayIndexOutOfBoundsException: 16