无法使用Apache Commons CSV读取CSV文件 - IllegalArgumentException

时间:2018-03-13 18:59:47

标签: java apache csv ebay-api

我正在尝试使用Apache Commons CSV从CSV文件(我从EBay的MIP服务器下载)访问数据但是我遇到以下错误:

CSVParser csvParser = null;

    String selectedCategoryIDFieldName = "Selected Category ID";

    try {
        Reader reader = Files.newBufferedReader(Paths.get(CSVFile));
        csvParser = new CSVParser(reader, CSVFormat.DEFAULT
                .withHeader("SKU", "Locale", "Title", "Channel", selectedCategoryIDFieldName)
                .withIgnoreHeaderCase()
                .withTrim()
                .withSkipHeaderRecord(true));
    } catch (Exception e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    if (csvParser != null) {
        List<CSVRecord> csvRecords = csvParser.getRecords();
        for (CSVRecord csvRecord : csvRecords) {
            // Accessing values by the names assigned to each column

            try {
                long currentRecordNumber = csvRecord.getRecordNumber();
                String SKU = csvRecord.get("SKU");
                String categoryID = csvRecord.get(selectedCategoryIDFieldName);
                // ^^ this line throws `IllegalArgumentException`


                System.out.println("Current record number: " + currentRecordNumber);
                System.out.println("SKU - >  " + SKU);
                System.out.println("categoyrID -> "  + categoryID);


            } catch (Exception e) {
                e.printStackTrace();
            }   
        }

我不太确定原因,因为该文件明确包含此索引。我的CSV文件如下所示:

enter image description here

我正在使用以下代码访问文件:

for (CSVRecord csvRecord : csvRecords)

我在SO周围搜索,我找到的最接近的问题是here,但它与我的问题无关,因为格式在保存之前/之后完全相同(换句话说,我看不到格式有问题,就像其他用户提问一样。)

更新:我刚刚在/-/LabelName循环的第二次迭代中意识到这个错误表面(该文件只包含一条记录)。但是,如果CSV文件中只有一条记录,我仍然不明白为什么它会迭代两次..为什么它只按类别ID而不是SKU列表示?

3 个答案:

答案 0 :(得分:0)

记录中必须有一些空格.2。在记事本或记事本++中打开文件。

我不熟悉apache commons csv所以它可能不是最佳解决方案

for (CSVRecord csvRecord : csvRecords) {
   if(csvRecord.size() >= csvParser.getHeaderMap.size()){  <--- add this if condition

答案 1 :(得分:0)

如果行的尾随值为空,则它们可能会与其分隔符一起被省略,从而导致标题的大小大于行值的大小。这是非常有效的(?)CSV 文件。要调整您的解析器,请使用 <html> <head> <title>footlocker.dk</title> <style> #cmsg{animation: A 1.5s;}@keyframes A{0%{opacity:0;}99%{opacity:0;}100%{opacity:1;}} </style> </head> <body style="margin:0"> <p id="cmsg">Please enable JS and disable any ad blocker</p> <script> var dd={'cid':'AHrlqAAAAAMA2k9UvgFgVkIAk04eSQ==','hsh':'A55FBF4311ED6F1BF9911EB71931D5','t':'fe','r':'b','s':17434,'host':'geo.captcha-delivery.com'}</script><script src="https://ct.captcha-delivery.com/c.js"> </script> </body> </html> 方法:

isSet()

答案 2 :(得分:-1)

也许给univocity-parsers一个好处,因为它可以很好地处理损坏的CSV(包括在这里和那里处理意外的空格),它也比commons-csv 3 times faster。它还应该使您的代码更清晰,因为您不必在任何地方放置try / catch块。

CsvParserSettings settings = new CsvParserSettings();
settings.detectFormatAutomatically();
settings.setHeaders("SKU", "Locale", "Title", "Channel", selectedCategoryIDFieldName);
// settings.setHeaderExtractionEnabled(true); //use this if the headers are in the input

CsvParser parser = new CsvParser(settings);
List<Record> records = parser.parseAllRecords(new File("/path/to/your.csv"));

希望这有帮助。

免责声明:我是这个图书馆的作者。它是开源和免费的(Apache 2.0许可证)