当前位置: 首页 > 面试题库 >

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

宗政元青
2023-03-14
问题内容

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


问题答案:

读取CSV文件

以下示例使用了CsvDozerBeanReader(我们刚刚发布的新阅读器,该阅读器使用Dozer进行了具有深度映射和基于索引的映射支持的Bean映射)-它基于我们网站上的示例。如果你不需要推土机功能(或者只需要一个简单的独立依赖项),则可以使用它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类,各自有一个列表答案秒。为了使映射起作用,你的类应为有效的Javabeans(即具有默认的no-arg构造函数,并为每个字段定义了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" };

Conversion and Validation

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

使用单元处理器完全是可选的 -没有它们,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
};

Reading

使用Super CSV进行读取非常灵活:你可以自己Reader提供文件(这样你就可以从文件,类路径,zip文件等中读取文件),并且可以通过首选项(其中有许多前置定义的配置,可满足大多数使用情况)。

下面的代码是不言自明的。

  1. 创建读者(使用Reader和的首选项)
  2. (可选)阅读标题
  3. 配置bean映射
  4. 继续打电话,read()直到收到null(文件结尾)
  5. 关闭阅读器

码:

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]]]


 类似资料:
  • 本文向大家介绍Java读写文件方法总结(推荐),包括了Java读写文件方法总结(推荐)的使用技巧和注意事项,需要的朋友参考一下 Java的读写文件方法在工作中相信有很多的用处的,本人在之前包括现在都在使用Java的读写文件方法来处理数据方面的输入输出,确实很方便。奈何我的记性实在是叫人着急,很多时候既然都会想不起来怎么写了,不过我的Java代码量也实在是少的可怜,所以应该多多练习。这里做一个总结,

  • 我在使用JavaScript读取JPEG二进制数据时遇到了一些问题,并且正在寻找一些关于库或替代方法的建议。 我正在修改一个名为jsPDF的开源PDF生成库,以便它能够与Appcelerator Tian Alloy 3.41项目一起使用。我遇到的问题是,虽然Tianium使用JavaScript,但实现并不支持所有数据类型或方法。 例如,我发现的大多数JPEG库都使用在web浏览器中实现的ato

  • 问题内容: 我正在读取2个csv文件:&。 我希望能够将CSV文件与进行比较。1)如果项目名称匹配,只需更新store_inventory中的数量。2)如果new_acquisitions具有不存在的新项目,则将其添加到中。 这是我到目前为止所做的,但是效果不是很好。我在需要添加taks 1 和 2的 地方添加了注释。 任何建议或执行上述任务的代码都将非常有用!谢谢。 再次感谢任何帮助。=] 问题

  • 本文向大家介绍请你分别用不超过200个字推荐(是“推荐”,不是“介绍”)一首你最喜欢的歌曲(或歌手)、电台(或主播),要求能打动一个陌生人,让ta也喜欢上你的推荐。如果你没有要推荐的,也可以不作答。相关面试题,主要包含被问及请你分别用不超过200个字推荐(是“推荐”,不是“介绍”)一首你最喜欢的歌曲(或歌手)、电台(或主播),要求能打动一个陌生人,让ta也喜欢上你的推荐。如果你没有要推荐的,也可以

  • 我的问题是: > 如何使其与较大的文件一起工作? 有什么办法能让它快一点吗? 我的电脑有8GB的RAM,运行64位Windows 7,处理器是3.40GHz(不确定你需要什么信息)。

  • 主要内容:read_csv(),to_csv()在《 Python Pandas读取文件》中,我们讲解了多种用 Pandas 读写文件的方法。本节我们讲解如何应用这些方法 。 我们知道,文件的读写操作属于计算机的 IO 操作,Pandas IO 操作提供了一些读取器函数,比如 pd.read_csv()、pd.read_json 等,它们都返回一个 Pandas 对象。 在 Pandas 中用于读取文本的函数有两个,分别是: read_csv(