Java 在SuperCSV中解析字符串

Java 在SuperCSV中解析字符串,java,csv,supercsv,Java,Csv,Supercsv,@卡洛诉丹戈 我简化了我的问题,并阅读了文档——这是一个很好的建议,不要惊慌。不过,我还是有问题。帮我解决一个问题,它会解决所有问题。多谢各位 问题:当我的csv记录缺少一个非字符串字段时,如何(甚至如何)将缺少的条目转换为默认值,或者至少不抛出NullPointerException?可选的cellProcessor似乎也不能防止错误 这是一个基本上取自SuperCSV网站的程序 package com.test.csv; import java.io.FileReader; import

@卡洛诉丹戈 我简化了我的问题,并阅读了文档——这是一个很好的建议,不要惊慌。不过,我还是有问题。帮我解决一个问题,它会解决所有问题。多谢各位

问题:当我的csv记录缺少一个非字符串字段时,如何(甚至如何)将缺少的条目转换为默认值,或者至少不抛出NullPointerException?可选的cellProcessor似乎也不能防止错误

这是一个基本上取自SuperCSV网站的程序

package com.test.csv;
import java.io.FileReader;

import org.supercsv.cellprocessor.ParseBigDecimal;
import org.supercsv.cellprocessor.ParseDate;
import org.supercsv.cellprocessor.ParseInt;
import org.supercsv.cellprocessor.ift.CellProcessor;
import org.supercsv.io.CsvBeanReader;
import org.supercsv.io.ICsvBeanReader;
import org.supercsv.prefs.CsvPreference;


public class CSVReader {

private static final CellProcessor[] cellProcessor = new CellProcessor[] {
    null,
    null,
    new ParseInt(),
    new ParseDate("yyyyMMdd"),      
    new ParseBigDecimal()       
};

public static void main (String[] args ) throws Exception {

    CsvPreference pref = new CsvPreference('"', '|', "\n");

    ICsvBeanReader inFile = new CsvBeanReader(new FileReader("C:\\temp\\sapfilePipe.txt"), pref);
    try {
        final String[] header = inFile.getCSVHeader(true);
        User user;
        while ((user = inFile.read(User.class, header, cellProcessor)) != null) {
            System.out.println(user);
        }
    } finally {
        inFile.close();
    }

}
}

这是我正在阅读的CSV文件。请注意,第一条记录中缺少一个字段(年龄)

我的用户bean:

package com.test.csv;

import java.math.BigDecimal;
import java.util.Date;

public class User {

private String firstName;
private String lastName;
private int age;
private Date hireDate;
private BigDecimal hourlyRate;
    ...getters/setters...   
以下是错误:

Exception in thread "main" java.lang.NullPointerException
    at org.supercsv.io.CsvBeanReader.fillObject(Unknown Source)
    at org.supercsv.io.CsvBeanReader.read(Unknown Source)
    at com.glazers.csv.CSVReader.main(CSVReader.java:31)

谢谢。

列表阅读器将每一行读入字符串列表。看来这就是你要找的


或者,如图所示,如果不想执行任何特定操作,可以将处理器设置为null。

编辑:更新

超级CSV 2.0.0-beta-1现在发布了。它包括许多错误修复和新功能(包括Maven支持和用于映射嵌套属性和数组/集合的新Dozer扩展)

它还改变了空(
“”
)列的处理方式-它们现在被读取为
null
。 这意味着bean中的
firstName
lastName
字段现在将是
null
,而不是
,如果它们不在CSV文件中

Optional()
处理器已经更新,以满足这一需求-因此它仍将以相同的方式运行

我建议使用
Token
的建议不再适用:您应该使用
ConvertNullTo

new ConvertNullTo(-1, new ParseInt())

您真正想要的是
可选的
CellProcessor,它只允许链中的下一个处理器在列不为空时执行

因此,请将您的CellProcessor阵列更新为:

private static final CellProcessor[] cellProcessor = new CellProcessor[] {
    null,
    null,
    new Optional(new ParseInt()),
    new ParseDate("yyyyMMdd"),      
    new ParseBigDecimal()       
};
这样,
ParseInt
将只在列不为空时执行(CellProcessors从左到右执行),将bean中的int字段保留为默认值0

如果要将字段设置为-1以指示未提供任何值,则可以使用
令牌
处理器,该处理器将用所需值替换任何令牌(在本例中为“”),对于任何其他输入,它将继续到下一个处理器。i、 e

new Token("", -1, new ParseInt())
@Carlo V.Dango CsvListReader是一个非常原始的实现(您将失去映射到bean的能力),因此我只会将其用于快速而肮脏的解析

我只建议在数组中使用
null
(读取时)来处理不需要进一步处理的字符串属性


顺便说一下,我正在为即将发布的超级CSV项目工作。我一定会在网站上改进代码示例;)

嗨。。。如果我有一个应该转换为BigDecimal的空白列,我已经尝试了new ParseBigDecimal(new Strerece(“,“0”)),在构建cellprocessors时,您是从内到外构建还是从外到内构建……例如。。如果在一个列中有一个空白,否则它将是一个量值,那么我如何将处理器链转换为0,然后使用PARSEBigDePiple?我非常渴望理解我不理解的东西。意识到我可以在CellProcessor数组中设置空值是一件大事。在网站示例中,我将其解释为“已阅读但未处理”,完全被“忽略”,如其“由外而内”部分所示。这是第一个使用独特处理器的示例。尽量不要惊慌,而是集中精力阅读文档。它的标题是“入门”,因此应该有一定的相关性。非常感谢你的提示。在我最初的问题中,我采用了在bean中生成所有字段字符串的方法,并在以后的过程中解析它们。我将获取此示例,并使用必须使用的输入文件对其运行测试。我一直认为我的问题是我自己在连接细胞处理器方面的笨拙。我喜欢豆豆读者/作家。我们公司正在转换为SAP,SAP有很多机会为所有定制界面读取/写入CSV文件。SuperCSV现在在我们的处理过程中扮演着重要角色。@Davidson很高兴听到您仍在使用SuperCSV,这是一个很棒的小API。它已经休眠了一段时间,但我最近加入了这个项目,希望能给它注入一些新的活力。如果您对新功能有任何问题或想法,请在Super CSV SourceForge论坛上发布-我们很乐意听到您的意见。幸运的是,您与SAP的界面是CSV,在我的工作中,它是定位的(第一列是20个字符,第二列是10个字符,等等)!!顺便问一下,如果你觉得这有帮助,你能投票/选择这个答案吗?
new Token("", -1, new ParseInt())