Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何设置变量数组值_Java_Arrays_Sqlite_Jdbc_Prepared Statement - Fatal编程技术网

Java 如何设置变量数组值

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

这里,准备好的语句应该使用数组将CSV文件中的一行数据插入到数据库行中。问题是CSV文件中的行发生了很大的变化,因此最终出现了数组越界错误,因为准备好的语句可能会调用行读取器没有的数组索引

我尝试过不同的预处理语句方法,但在这里没有一种方法能帮上忙

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)写入数据库的任务分开

由于错误,csv中的一行只有15个元素,这16个元素丢失了可能一个想法是获取令牌。length通过其值构建查询您是否可以控制csv输入?如果是这样,最好为任何缺少的字段设置空/空/默认值。数组从索引0开始。为什么要将数组长度设置为PreparedStatement的第一个参数?亲爱的Down Voter,请在投票时留下建设性的评论。
java.lang.ArrayIndexOutOfBoundsException: 16