有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaCSVTobean。解析失败,解析CSV时出错

我试图在Eclipse中用OpenCSV解析一个大的CSV文件。 以下是CSV文件的前4条记录。完整文件有219590条记录:-

0,23,1,0,someone@email.com,"Construction/Contractors/Contractors"
0,43,1,0,someone@email.com,"Engineering/Electrical Engineering/Electrical Engineering"
0,395,1,0,someone@email.com,"Sales/Sales Force Management/Sales Management"
0,398,1,0,someone@email.com,"Sales/Sales Strategy/Sales"

下面是Java代码:-

    File csvFile = new File("data/userattrib2_30day.csv");
    ColumnPositionMappingStrategy strategy = new ColumnPositionMappingStrategy();
    strategy.setType(UserAttribRecord.class);
    String[] columns = new String[] {"userId", "attributeId", "rating", "timestamp", "email", "attributeDesc"};
    strategy.setColumnMapping(columns);

    CSVReader reader = new CSVReader(new FileReader(csvFile));
    CsvToBean<UserAttribRecord> csv = new CsvToBean<UserAttribRecord>();
    List<UserAttribRecord> userAttribList = csv.parse(strategy,reader);

它失败于:-

Exception in thread "main" java.lang.RuntimeException: Error parsing CSV!
at com.opencsv.bean.CsvToBean.parse(CsvToBean.java:95)
at com.opencsv.bean.CsvToBean.parse(CsvToBean.java:75)

如何找出错误是什么?似乎没有任何调试信息,所以我不知道哪个字段的哪个记录出现了错误。如何调试这个? 谢谢


共 (2) 个答案

  1. # 1 楼答案

    我刚刚尝试了univocity-parsers,我可以毫无问题地解析您的示例输入。试一试,因为它比OpenCSV快两倍(平均快两倍)。这是我的代码:

    首先,将@Parsed注释添加到要从CSV加载的字段中(有许多选项可用,请查看文档)

    public static class UserAttributeRecord{
    
        @Parsed
        int userId;
    
        @Parsed
        int attributeId;
    
        @Parsed
        int rating;
    
        @Parsed
        long timestamp;
    
        @Parsed
        String email;
    
        @Parsed
        String attributeDesc;
    }
    

    以下是解析文件所需的代码:

    public static void main(String[] args) throws IOException{
    
        //creates a processor of java beans.
        BeanListProcessor<UserAttributeRecord> beanProcessor = new BeanListProcessor<UserAttributeRecord>(UserAttributeRecord.class);
    
        //then a settings object to configure the parser
        CsvParserSettings settings = new CsvParserSettings(); //many options here, check the tutorial
    
        //configures the parser to use the bean processor.
        settings.setRowProcessor(beanProcessor);
    
        //configures the input format.
        settings.setHeaders("userId", "attributeId", "rating", "timestamp", "email", "attributeDesc");
        settings.getFormat().setLineSeparator("\n");
    
        //creates a parser with your settings
        CsvParser parser = new CsvParser(settings);
    
        //parses everything. All rows are submitted to the row processor defined above
        parser.parseAll(new FileReader(new File("/path/to/file.csv")));
    
        //here's your list of beans
        List<UserAttributeRecord> beans = beanProcessor.getBeans();
    }
    

    披露:我是这个图书馆的作者。它是开源和免费的(Apache V2.0许可证)

  2. # 2 楼答案

    如果你能自己构建,那就用opencsv的主干构建吧。我修改了CsvToBean以打印出错误发生时它所在的行号

    throw new RuntimeException("Error parsing CSV line: " + lineProcessed + " values: " + Arrays.toString(line), e);
    

    这将在3.6版本中发布,除非出现任何问题,否则应该在感恩节前发布

    我很好奇是什么错误导致了这一点。如果你再往下看一下你的异常堆栈跟踪,你应该会看到一个“由引起的:”就是CsvToBean捕获的异常。考虑到你有超过20万行代码,我怀疑你遇到了内存不足的异常——这意味着你要么需要将文件拆分成更小的文件,增加JVM的内存,要么使用3.5版本中引入的IterableCsvToBean,它允许逐行解析

    希望有帮助

    :)