java - CsvMapReader 似乎无法解析我的文件

标签 java csv supercsv

我有一个非常简单的 tsv 文件,其条目如下:

614 2006-07-13 15:30:05 2009-11-20 23:56:21 510 350 3265    10  34
1038    2006-07-15 16:12:15 2009-11-16 05:12:11 304 443 4405    7   156
1437    2006-07-16 12:29:24 2009-11-16 16:25:12 45  73  725 6   37
2615    2006-07-19 23:23:55 2009-11-27 18:34:36 211 230 211 7   0
3148    2006-07-26 14:17:22 2009-11-20 17:35:18 7346    7244    11438   8   97
5593    2006-09-08 10:58:49 2009-11-24 06:08:27 898 1024    2897    8   56

它没有标题,而且我是从另一个来源获取它的,所以我无法控制它的编写方式。我想阅读第一列,用它做一些事情,然后忽略其余的。

我的代码是:

    List<Long> userIds = new ArrayList<Long>();

    ICsvMapReader mapReader =  null;
    try {
        mapReader = new CsvMapReader(new FileReader(inFile), CsvPreference.TAB_PREFERENCE);  

        // only map the first column - setting header elements to null means those columns are ignored
        final String[] header = new String[] { "userid", null, null, null, null, null, null };

        final CellProcessor[] processors = new CellProcessor[] {null,
                null,
                null,
                null,
                null,
                null,
                null };

        Map<String, Object> userMap;
        while( (userMap = mapReader.read(header, processors)) != null ) {
            Long userId = Long.parseLong(userMap.get("userid").toString());
            userIds.add(userId);
        }

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    finally {
        IOUtils.closeQuietly(mapReader);
    }

我没有遇到任何异常,但 mapReader.read() 行始终返回 null。我尝试在处理器的第一个位置使用 new ParseLong() 代替 null,但这没有效果。我觉得我错过了一些非常基本的东西。

最佳答案

您的代码对我来说工作得很好,尽管我必须向 header 和处理器添加一个额外的 null 元素,因为您的数据中实际上有 8 列。否则 Super CSV 会抛出异常:

org.supercsv.exception.SuperCsvException: The number of columns 
to be processed (8) must match the number of CellProcessors (7): 
check that the number of CellProcessors you have defined matches 
the expected number of columns being read/written
context={lineNo=1, rowNo=1, columnNo=1, rowSource=
[614, 2006-07-13 15:30:05, 2009-11-20 23:56:21, 510, 350, 3265, 10, 34]}

我会检查您是否正在读取正确的文件 - 听起来您正在读取一个空文件...

关于java - CsvMapReader 似乎无法解析我的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23794481/

相关文章:

java - 如何使用mockito答案从模拟方法修改void方法的输入参数

java - 带有 REST https 调用的客户端应用程序

java - 简单XML : ConstructorException

mysql - 从 CSV 导入到 (My)SQL 数据库时,我能否将 Unix 时间戳自动转换为 DATETIME 列?

java - supercsv 与 jdk 1.7 的兼容性

java - 格式化 Bean 生成器的 header 字段 - Java

java - Java 中十六进制 key 、IV 和数据的 AES 加密

mysql - 从带标题的 CSV 文件创建表

python - 使用python向csv文件添加列标题,读取json

java - 我怎样才能告诉 SuperCSV 不要将空字符串映射到 null