当前位置:  开发笔记 > 编程语言 > 正文

你能推荐一个Java库来读取(并可能写)CSV文件吗?

如何解决《你能推荐一个Java库来读取(并可能写)CSV文件吗?》经验,为你挑选了3个好方法。

你能推荐一个Java库来读取,解析,验证和映射逗号分隔值(CSV)文件中的行到Java值对象(JavaBeans)吗?



1> Gary McWilli..:

我们使用 http://opencsv.sourceforge.net/ 取得了很好的成功

我还遇到了另一个有很好链接的问题: 用于将CSV转换为XML文件的Java库或应用程序?



2> James Basset..:

Super CSV是读取/解析,验证CSV文件并将其映射到POJO的绝佳选择!

我们(Super CSV团队)刚刚发布了一个新版本(您可以从SourceForge或Maven 下载它).

读取CSV文件

以下示例使用CsvDozerBeanReader(我们刚刚发布的一个新的阅读器,它使用Dozer进行bean映射,具有深度映射和基于索引的映射支持) - 它基于我们网站上的示例.如果您不需要Dozer功能(或者您只是想要一个简单的独立依赖项),那么您可以使用CsvBeanReader(请参阅此代码示例).

示例CSV文件

以下是一个示例CSV文件,表示对调查的响应.它有一个标题和3行数据,全部有8列.

age,consentGiven,questionNo1,answer1,questionNo2,answer2,questionNo3,answer3
18,Y,1,Twelve,2,Albert Einstein,3,Big Bang Theory
,Y,1,Thirteen,2,Nikola Tesla,3,Stargate
42,N,1,,2,Carl Sagan,3,Star Wars

定义从CSV到POJO的映射

每行CSV都将被读入SurveyResponse类,每个类都有一个Answer of List .为了使映射起作用,您的类应该是有效的Javabeans(即具有默认的无参数构造函数并且为每个字段定义了getter/setter).

在Super CSV中,您可以使用简单的String数组定义映射 - 数组的每个元素都对应于CSV文件中的一列.

CsvDozerBeanMapper你可以使用:

简单的字段映射(例如firstName)

深度映射(例如address.country.code)

索引映射(例如middleNames[1]- 数组或集合的从零开始的索引)

深度+索引映射(例如person.middleNames[1])

以下是此示例的字段映射 - 它使用以下组合:

private static final String[] FIELD_MAPPING = new String[] { 
        "age",                   // simple field mapping (like for CsvBeanReader)
        "consentGiven",          // as above
        "answers[0].questionNo", // indexed (first element) + deep mapping
        "answers[0].answer", 
        "answers[1].questionNo", // indexed (second element) + deep mapping
        "answers[1].answer", 
        "answers[2].questionNo", 
        "answers[2].answer" };

转换和验证

Super CSV有一个有用的单元处理器库,可用于将字符串从CSV文件转换为其他数据类型(例如Date,Integer),或进行约束验证(例如强制/可选,正则表达式匹配,范围检查) .

使用单元格处理器是完全可选的 - 没有它们,每列CSV都是一个字符串,因此每个字段也必须是一个字符串.

以下是该示例的单元处理器配置.与字段映射一样,数组中的每个元素都代表一个CSV列.它演示了单元处理器如何将CSV数据转换为字段的数据类型,以及如何将它们链接在一起.

final CellProcessor[] processors = new CellProcessor[] { 
    new Optional(new ParseInt()), // age
    new ParseBool(),              // consent
    new ParseInt(),               // questionNo 1
    new Optional(),               // answer 1
    new ParseInt(),               // questionNo 2
    new Optional(),               // answer 2
    new ParseInt(),               // questionNo 3
    new Optional()                // answer 3
};

使用Super CSV进行阅读非常灵活:您自己提供Reader(因此您可以从文件,类路径,zip文件等中读取),并且分隔符和引号字符可通过首选项进行配置(其中有许多预先配置) - 满足大多数用途的定义配置).

下面的代码非常明显.

    创建阅读器(包括您的Reader和首选项)

    (可选)阅读标题

    配置bean映射

    继续打电话read()直到你得到null(文件结束)

    关闭读者

码:

ICsvDozerBeanReader beanReader = null;
try {
    beanReader = new CsvDozerBeanReader(new FileReader(CSV_FILENAME),
        CsvPreference.STANDARD_PREFERENCE);

    beanReader.getHeader(true); // ignore the header
    beanReader.configureBeanMapping(SurveyResponse.class, FIELD_MAPPING);

    SurveyResponse surveyResponse;
    while( (surveyResponse = 
        beanReader.read(SurveyResponse.class, processors)) != null ) {
        System.out.println(
            String.format("lineNo=%s, rowNo=%s, surveyResponse=%s",
                beanReader.getLineNumber(), beanReader.getRowNumber(), 
                surveyResponse));
    }

} finally {
    if( beanReader != null ) {
        beanReader.close();
    }
}

输出:

lineNo=2, rowNo=2, surveyResponse=SurveyResponse [age=18, consentGiven=true, answers=[Answer [questionNo=1, answer=Twelve], Answer [questionNo=2, answer=Albert Einstein], Answer [questionNo=3, answer=Big Bang Theory]]]
lineNo=3, rowNo=3, surveyResponse=SurveyResponse [age=null, consentGiven=true, answers=[Answer [questionNo=1, answer=Thirteen], Answer [questionNo=2, answer=Nikola Tesla], Answer [questionNo=3, answer=Stargate]]]
lineNo=4, rowNo=4, surveyResponse=SurveyResponse [age=42, consentGiven=false, answers=[Answer [questionNo=1, answer=null], Answer [questionNo=2, answer=Carl Sagan], Answer [questionNo=3, answer=Star Wars]]]

更多信息

您可以在网站上找到更多信息!



3> Domchi..:

我可以推荐SuperCSV.简单易用,并做了我需要的一切.

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有