【问题标题】:Apache CSVParser is not workingApache CSVParser 不工作
【发布时间】:2015-06-16 17:38:14
【问题描述】:

考虑以下代码示例:

    private static CSVFormat CSV_FORMAT = CSVFormat.TDF;
    logger.debug("Processing record: {}", line);
    try {
        CSVParser parser = CSVParser.parse(line,CSV_FORMAT);
        if(parser.getRecords().isEmpty()) continue;
        csvRecord = parser.getRecords().get(0);
    } catch (IOException e) {
        logger.warn("Skipping line: " + line,e);
        continue;
    }

由于某种原因,这不是解析。我得到以下输出:

调试:
(OrderParser#parseData:121) - 处理记录:
136147091 340834429 2015 年 4 月 5 日 4:35:00
PM 262105109 UFH6285 6 0 0 HWF62 福尔摩斯加湿器更换
过滤器 8.99 53.94 0 39.91 0 8.09 0 5.94 5.12 7035997658 马蒂·乔 aa3003@mail.com 杰斯
Dude 555 Main st Anywhere CA 900000 1

java.lang.IndexOutOfBoundsException:索引:0,大小:0

尽管您可能无法通过 StackOverflow 看到这一点,但我保证那里有标签。但是,索引越界异常发生在 parser.getRecords().get(0)

如果我打电话给parser.getRecordNumber(),它会报告1。不知道是字符编码错误还是什么原因。

根据要求,这里有一些示例输入夹在 pre 标记内。这里有两行,但我只是发送第二行:

SNumber RecD Receip_ID ListingID Date_Entered 234 ReferenceId QT QT2 QT3 Title P456 Product_Rev Sh2687t Product Shipping Comm ShipFee PerItemFee Tax_Cost Company HoneCode Bill455 Bill788 Email Ship468644 Ship6489 Ship654132158 Ship98198 Ship_To_City Ship_To_State Ship_To_Zip ShippingMethodId 2644 7775 11457 26894 4/9/2015 9:47:00 AM 247520128 700364 1 0 0 Shark Navigator 14.99 14.99 0 11.75 0 2.25 0 0.99 0 84698 Shawn Vanloan 3504620ae7f03@mail.com s vanloo 166 EMain Rd Anywhere NY 12000 1

【问题讨论】:

  • 嗯,你上面的输出显然有空格而不是 TAB 字符。
  • 是的,就像我说的:我不认为让人们复制 n 粘贴制表符
  • 尝试将您的 CSV 样本放入 pastebin.com 之类的内容中,然后在此处链接。如果没有看到你的程序正在读取什么,就很难调试它。 (另外,如果是敏感的客户信息,请将名称和地址更改为更通用的名称)
  • 实际上,当你编辑它时,你可以看到标签,所以我相信你。但请自行编辑并在<pre> 标签内重新粘贴输出 - 使用引号格式似乎也在那里添加了换行符。或者换行符可能来自您的输出? line 有多少行?
  • 感谢您的反馈:不知道我们是否可以使用 pre,所以我现在已经添加了该数据并编辑了任何敏感信息

标签: java csv apache-commons


【解决方案1】:

根据 apidocs,parser.getRecords() 根据给定的格式解析文件并将内容作为列表返回。解析位置将在输入的末尾。所以再次调用parser.getRecords() 将返回一个空列表。

考虑明智地解析输入记录。

apidocs

【讨论】:

  • 啊,是的,你成功了。我没有意识到 CSVParser 实际上是一个可迭代的,这让我搞砸了。我认为“迭代器”这个词应该在类名中,但也许这只是我没有更彻底地检查 API 的借口!
【解决方案2】:

彼得郑的回答让我朝着正确的方向开始。对我来说,解决方案是在调用 CSVParser.parse 之后出现在代码中的。这实际上返回了一个可迭代的,所以我继续以下操作:

CSVParser parser = ... //Any method for obtaining a parser
for(CSVRecord record : parser) {

    //Code for operating on the record here
}

【讨论】:

    猜你喜欢
    • 2016-04-16
    • 2011-03-08
    • 1970-01-01
    • 2014-09-09
    • 2012-12-19
    • 2012-03-20
    • 2012-10-25
    • 2012-09-18
    • 2014-08-26
    相关资源
    最近更新 更多