【问题标题】:How do I set a variable array value [duplicate]如何设置变量数组值[重复]
【发布时间】:2019-12-23 16:23:29
【问题描述】:

这里准备好的语句应该使用数组将 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]);
java.lang.ArrayIndexOutOfBoundsException: 16

【问题讨论】:

  • 由于错误,csv中的一行只有15个元素,缺少16个元素
  • 也许一个想法是获取 tokens.length 以按其值构建查询
  • 您可以控制 CSV 输入吗?如果是这样,最好为任何缺失的字段设置一个空/空白/默认值。
  • 数组从索引 0 开始。
  • 为什么将PreparedStatement的第一个参数设置为数组的长度?

标签: java arrays sqlite jdbc prepared-statement


【解决方案1】:

答案取决于当线条不同时你想要什么。

您可以检查获得的令牌数组的长度,如果它与您想要的不同,您可以跳过该行的插入或在您无法获得的字段中放置空值。

【讨论】:

    【解决方案2】:

    文件中的字段数不同

    如果您的意思是单个文件的字段数可能不同,则违反了 CSV 规范 RFC 4180

    第 2.4 节:

    ... 每一行都应包含整个文件中相同数量的字段。 …

    您应该将该数据退回给发布它的任何人。并对出版商进行有关标准的教育。 CSV 是一个如此简单的想法,令人惊讶的是人们发现了多少种方法来搞砸它。

    字段数因文件而异

    如果您的意思是文件的字段数量不同,那么我认为存在一种模式。如果某些文件有 12 个字段,而其他文件有 16 个字段,那么我希望您知道每个文件中有哪些字段。如果是这样,请阅读每个文件的第一行,计算字段数,然后分支您的代码。在你的代码中有一个知道 12 字段文件的特定字段的例程。在你的代码中有另一个知道 16 字段文件的特定字段的例程。

    如果输入文件可以通过这种方式进行预测,我建议要求数据的发布者在文件标题中包含措辞,以表明其中包含哪种数据。这样您就可以避免对字段进行采样和计数。

    如果您的文件不可预测,那么没有什么神奇的解决方案。您可以查看文件中的示例值并猜测它们的类型,从而猜测列的含义,但我认为这样做是不合理的。我会拒绝将此错误的数据反馈给它的发布者。

    CSV 处理库

    最后,我有两个建议:

    • 使用库来读取/写入 CSV,而不是自己动手。您可以选择一些好的库。我已经成功使用了Apache Commons CSV
    • 考虑将 (a) 读取和验证 CSV 数据的任务与 (b) 写入数据库的任务分开。

    【讨论】:

    • 亲爱的投票者,请在投票的同时留下建设性的评论。
    猜你喜欢
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 2020-11-04
    相关资源
    最近更新 更多