java读取csv合适文件_解析-您可以推荐一个Java库来读取(并可能写入)CSV文件吗?...
Super CSV是讀取/解析,驗(yàn)證和映射CSV文件到POJO的絕佳選擇!
我們(Super CSV團(tuán)隊(duì))剛剛發(fā)布了一個(gè)新版本(您可以從SourceForge或Maven下載它)。
讀取CSV文件
以下示例使用read()(我們剛剛發(fā)布的新閱讀器,使用Dozer進(jìn)行具有深度映射和基于索引的映射支持的Bean映射)-該示例基于我們網(wǎng)站上的示例。 如果不需要推土機(jī)功能(或者只需要簡(jiǎn)單的獨(dú)立依賴項(xiàng)),則可以改用null(請(qǐng)參見此代碼示例)。
CSV文件示例
這是一個(gè)示例CSV文件,代表對(duì)調(diào)查的答復(fù)。 它有一個(gè)標(biāo)題和3行數(shù)據(jù),所有行都有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類,每個(gè)類都有一個(gè)“答案列表”。 為了使映射起作用,您的類應(yīng)該是有效的Javabeans(即具有默認(rèn)的no-arg構(gòu)造函數(shù),并為每個(gè)字段定義了getter / setter)。
在Super CSV中,您可以使用簡(jiǎn)單的String數(shù)組定義映射-數(shù)組的每個(gè)元素都對(duì)應(yīng)于CSV文件中的一列。
使用read()您可以使用:
簡(jiǎn)單字段映射(例如read())
深度映射(例如read())
索引映射(例如read()-數(shù)組或集合的從零開始的索引)
深度+索引映射(例如read())
以下是此示例的字段映射-它使用了這些的組合:
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" };
轉(zhuǎn)換和驗(yàn)證
超級(jí)CSV具有有用的單元處理器庫(kù),可用于將字符串從CSV文件轉(zhuǎn)換為其他數(shù)據(jù)類型(例如,日期,整數(shù)),或進(jìn)行約束驗(yàn)證(例如,強(qiáng)制/可選,正則表達(dá)式匹配,范圍檢查) 。
使用單元處理器是完全可選的-沒(méi)有它們,CSV的每一列都將是一個(gè)字符串,因此每個(gè)字段也必須是一個(gè)字符串。
以下是該示例的單元處理器配置。 與字段映射一樣,數(shù)組中的每個(gè)元素都代表一個(gè)CSV列。 它演示了單元處理器如何將CSV數(shù)據(jù)轉(zhuǎn)換為您字段的數(shù)據(jù)類型,以及如何將它們鏈接在一起。
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進(jìn)行讀取非常靈活:您可以提供自己的read()(以便您可以從文件,類路徑,zip文件等中讀取內(nèi)容),并且可以通過(guò)首選項(xiàng)配置定界符和引號(hào)字符(其中有很多 滿足大多數(shù)用途的預(yù)定義配置)。
下面的代碼是不言自明的。
創(chuàng)建閱讀器(帶有read()和首選項(xiàng))
(可選)閱讀標(biāo)題
配置bean映射
繼續(xù)撥打read(),直到得到null(文件末尾)
關(guān)閉閱讀器
碼:
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]]]
更多信息
您可以在網(wǎng)站上找到更多信息!
總結(jié)
以上是生活随笔為你收集整理的java读取csv合适文件_解析-您可以推荐一个Java库来读取(并可能写入)CSV文件吗?...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机网络技术三级做题技巧,三级网络技术
- 下一篇: 【Jmeter篇】1小时轻松搞定项目接口