你能推荐一个Java图书馆的阅读(以及可能写作)CSV文件吗?[关闭]
题
你能推荐一个Java图书馆的阅读、分析、验证和绘图行中用逗号分隔值(CSV)文件Java值的对象(定时器的事件驱动方式)?
解决方案
我们已经习惯了 http://opencsv.sourceforge.net/ 取得了不错的成就
我还遇到了另一个有良好链接的问题: Java lib或app将CSV转换为XML文件?
其他提示
超级CSV 是一个伟大的选择阅读/析,验证和映射CSV的文件独!
我们(超CSV队)刚刚发布了一个新的版本(可以 下载 它从SourceForge或专家).
读一CSV文件
下述例子使用 CsvDozerBeanReader
(a新的阅读器,我们刚刚发布的使用 推土机 对于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组
每个行CSV将读取到一个 SurveyResponse 类,每一个都有一个列表中的 答案s.为了为映射工作,你的课程应该是有效的定时器的事件驱动方式(i。e有一个默认没有参数构造方法和已经吸气/者定义为每个字段)。
在超级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" };
转换和验证
超级CSV有一个有用的图书馆 单元处理器, ,这可使用转换串CSV文件的其他数据的类型(例如今,整数),或者要做到约束的验证(例如强制性/可选的,regex匹配,范围检查).
采用单元处理器 完全可选的 -没有他们的每一列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
(所以你可以读一个文件,类路径,一个压缩文件,等等),并分隔和报价字是可以通过 喜好 (其中有一些预先确定的配置,满足对于大多数用途).
代码下面是不言自明的。
创建阅读器(与你的
Reader
和偏好)(可选)阅读头
配置豆映射
保持通话
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]]]
更多信息
你可以找到更多的信息 网站!
我可以推荐 SuperCSV 。简单易用,并做了我需要的一切。
嘿,我有一个开源项目: JFileHelpers 。我认为主要的优点是它使用Java Annotations,看看:
如果你有这个bean:
@FixedLengthRecord()
public class Customer {
@FieldFixedLength(4)
public Integer custId;
@FieldAlign(alignMode=AlignMode.Right)
@FieldFixedLength(20)
public String name;
@FieldFixedLength(3)
public Integer rating;
@FieldTrim(trimMode=TrimMode.Right)
@FieldFixedLength(10)
@FieldConverter(converter = ConverterKind.Date,
format = "dd-MM-yyyy")
public Date addedDate;
@FieldFixedLength(3)
@FieldOptional
public String stockSimbol;
}
想要解析这个文件:
....|....1....|....2....|....3....|....4
1 Antonio Pereira 10012-12-1978ABC
2 Felipe Coury 201-01-2007
3 Anderson Polga 4212-11-2007DEF
你所要做的就是:
FileHelperEngine<Customer> engine =
new FileHelperEngine<Customer>(Customer.class);
List<Customer> customers =
new ArrayList<Customer>();
customers = engine.readResource(
"/samples/customers-fixed.txt");
此外,它还支持主细节,日期和格式转换等等。让我知道你的想法!
祝你好运!
我发现 Flatpack 非常适合处理古怪的CSV文件(转义,引号,不良记录,等)
之前询问的CSV文件到XML问题似乎回答了我的所有问题。
OpenCSV( http://opencsv.sourceforge.net/ )也使用a绑定到JavaBeans列位置映射策略
ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy();
strat.setType(YourOrderBean.class);
String[] columns = new String[] {"name", "orderNumber", "id"}; // the fields to bind do in your JavaBean
strat.setColumnMapping(columns);
CsvToBean csv = new CsvToBean();
List list = csv.parse(strat, yourReader);
JSEFA( http://jsefa.sourceforge.net )似乎也做了我需要的一切 - 特别是绑定到Java对象 - 除了支持FLR和XML
请参阅 CVSBeans