超级CSV是读取/解析、验证CSV文件和将CSV文件映射到POJO的最佳选择!
我们(超级CSV团队)刚刚发布了一个新版本(你可以下载它来自SourceForge或Maven)。
读取CSV文件
下面的示例使用CsvDozerBeanReader(我们刚刚发布的一个新阅读器杜泽尔对于具有深度映射和基于索引的映射支持的bean映射,它基于我们网站..如果您不需要Dozer功能(或者只需要一个简单的独立依赖项),那么您可以使用CsvBeanReader相反(看这个代码示例).
示例CSV文件
下面是一个示例CSV文件,它表示对调查的响应。它有一个标题和3行数据,都有8列。age,consentGiven,questionNo1,answer1,questionNo2,answer2,questionNo3,answer318,Y,1,Twelve,2,Albert Einstein,3,Big Bang Theory,Y,1,
Thirteen,2,Nikola Tesla,3,Stargate42,N,1,,2,Carl Sagan,3,Star Wars
定义CSV到POJO的映射
CSV的每一行将被读取为测量响应类,每个类都有一个回答为了使映射工作起来,类应该是有效的Javabeans(即有一个默认的no-arg构造函数,并且为每个字段定义了getters/setter)。
在SuperCSV中,使用一个简单的字符串数组定义映射-数组的每个元素对应于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" };
转换和验证
SuperCSV有一个有用的库单元处理器,它可用于将字符串从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};
读
使用超级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]]]
更多信息
您可以在网站!