您能推荐一个Java库来读取(并可能写入)CSV文件吗?[已关闭]读取 CSV 文件
您能否推荐一个 Java 库来读取、解析、验证逗号分隔值 (CSV) 文件中的行并将其映射到 Java 值对象 (JavaBeans)?
您能否推荐一个 Java 库来读取、解析、验证逗号分隔值 (CSV) 文件中的行并将其映射到 Java 值对象 (JavaBeans)?
超级CSV是读取/解析,验证和将CSV文件映射到POJO的绝佳选择!
我们(Super CSV团队)刚刚发布了一个新版本(您可以从SourceForge或Maven下载)。
以下示例使用(我们刚刚发布的新阅读器,它使用 Dozer 进行豆类映射,支持深度映射和基于索引的映射) - 它基于我们网站的示例。如果您不需要 Dozer 功能(或者您只需要一个简单的独立依赖项),则可以改用(请参阅此代码示例)。CsvDozerBeanReader
CsvBeanReader
下面是一个示例 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 将被读入一个 SurveyResponse 类,每个类都有一个答案列表。为了使映射正常工作,您的类应该是有效的Javabean(即具有默认的no-arg构造函数,并为每个字段定义了getters/setters)。
在Super CSV中,您可以使用简单的字符串数组定义映射 - 数组的每个元素对应于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文件转换为其他数据类型(例如日期,整数),或进行约束验证(例如强制/可选,正则表达式匹配,范围检查)。
使用单元格处理器是完全可选的 - 如果没有它们,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进行读取非常灵活:您可以提供自己的内容(因此您可以从文件,类路径,zip文件等中读取),并且分隔符和引号字符可以通过首选项进行配置(其中有许多预定义的配置可以满足大多数用法)。Reader
下面的代码非常不言自明。
创建阅读器(使用您的首选项和首选项)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]]]
您可以在网站上找到更多信息!