SuperCSV – CsvBeanReader,CellProcessor,CsvBeanWriter
SuperCSV的动力将是针对Java的最重要,最快和最方便程序员的免费CSV软件包。
不幸的是,我们在Java中没有内置的CSV解析器。
超级CSV
Java中有许多开源CSV解析器。
但是SuperCSV分析器是我的最爱。
超级CSV解析器的功能是具有许多功能的" CellProcessor"。
您可以将列值指定为NotNull,可选,唯一。
SuperCSV单元处理器还支持日期时间转换,乔达时间,枚举等。
今天,我们将研究SuperCSV示例,以读取CSV文件并将其转换为Java对象列表。
我们还将快速浏览Super CSV示例程序,以编写CSV数据。
在研究示例之前,我们必须创建示例CSV数据和相应的java bean。
1,hyman Kumar,20,San Franceco 2,David Dan,40,USA 3,Lisa Ray,28,Germany
我们对应的Java bean类是" Employee.java",如下所示。
package com.theitroad.csv.model; public class Employee { private String id; private String name; private String age; private String country; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } @Override public String toString() { return "{" + id + "::" + name + "::" + age + "::" + country + "}"; } }
SuperCSV Maven
在您的maven项目pom.xml文件中添加以下依赖项以获取Super CSV jar。
<dependency> <groupId>net.sf.supercsv</groupId> <artifactId>super-csv</artifactId> <version>2.4.0</version> </dependency>
SuperCSV CsvBeanReader
这是一个简单的Super CSV示例程序,使用CsvBeanReader
来解析java对象的CSV数据列表。
package com.theitroad.csv.supercsv.parser; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.supercsv.cellprocessor.Optional; import org.supercsv.cellprocessor.constraint.NotNull; import org.supercsv.cellprocessor.constraint.UniqueHashCode; import org.supercsv.cellprocessor.ift.CellProcessor; import org.supercsv.io.CsvBeanReader; import org.supercsv.io.ICsvBeanReader; import org.supercsv.prefs.CsvPreference; import com.theitroad.csv.model.Employee; public class SuperCSVParserExample { public static void main(String[] args) throws IOException { List<Employee> emps = new ArrayList<Employee>(); ICsvBeanReader beanReader = new CsvBeanReader(new FileReader("emps.csv"), CsvPreference.STANDARD_PREFERENCE); //the name mapping provide the basis for bean setters final String[] nameMapping = new String[] { "id", "name", "age", "country" }; //to read and skip header row //final String[] header = beanReader.getHeader(true); final CellProcessor[] processors = getProcessors(); Employee emp; while ((emp = beanReader.read(Employee.class, nameMapping, processors)) != null) { emps.add(emp); } System.out.println(emps); beanReader.close(); } private static CellProcessor[] getProcessors() { final CellProcessor[] processors = new CellProcessor[] { new UniqueHashCode(), //ID new NotNull(), //Name new Optional(), //Age new NotNull() //Country }; return processors; } }
该程序简单易懂,最重要的部分是创建超级CSV单元处理器。
如果您的CSV文件包含标题行,请使用beanReader.getHeader(true)读取并跳过标题以进行处理。
SuperCSV CsvBeanWriter
一个简单的超级CSV示例,使用CsvBeanWriter
写入CSV数据。
我假设年龄和国家/地区字段是可选的。
package com.theitroad.csv.supercsv.parser; import java.io.IOException; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; import org.supercsv.cellprocessor.Optional; import org.supercsv.cellprocessor.constraint.NotNull; import org.supercsv.cellprocessor.constraint.UniqueHashCode; import org.supercsv.cellprocessor.ift.CellProcessor; import org.supercsv.io.CsvBeanWriter; import org.supercsv.io.ICsvBeanWriter; import org.supercsv.prefs.CsvPreference; import com.theitroad.csv.model.Employee; public class SuperCSVWriterExample { public static void main(String[] args) throws IOException { List<Employee> emps = generateDemoData(); StringWriter writer = new StringWriter(); ICsvBeanWriter beanWriter = new CsvBeanWriter(writer, CsvPreference.STANDARD_PREFERENCE); final String[] header = new String[] { "id", "name", "age", "country" }; final CellProcessor[] processors = getProcessors(); //write the header beanWriter.writeHeader(header); //write the beans data for (Employee emp : emps) { beanWriter.write(emp, header, processors); } beanWriter.close(); System.out.println("CSV Data\n" + writer.toString()); } private static CellProcessor[] getProcessors() { final CellProcessor[] processors = new CellProcessor[] { new UniqueHashCode(), //ID new NotNull(), //Name new Optional(), //Age new Optional() //Country }; return processors; } private static List<Employee> generateDemoData() { List<Employee> emps = new ArrayList<>(); Employee emp = new Employee(); emp.setId("1"); emp.setName("hyman Kumar"); emp.setAge("30"); //country is optional and not set Employee emp1 = new Employee(); emp1.setId("2"); emp1.setName("David"); emp1.setCountry("USA"); //age is optional Employee emp2 = new Employee(); emp2.setId("3"); emp2.setName("Lisa"); emp2.setAge("20"); emp2.setCountry("San Franceco"); emps.add(emp); emps.add(emp1); emps.add(emp2); return emps; } }
上面的程序产生下面的CSV输出。
CSV Data id,name,age,country 1,hyman Kumar,30, 2,David,,USA 3,Lisa,20,San Franceco
如果您不希望标题行,请在上面的程序中注释代码beanWriter.writeHeader(header)
。
如果更改上述程序以使两个Employee对象的ID保持相同,则将获得以下异常。
Exception in thread "main" org.supercsv.exception.SuperCsvConstraintViolationException: duplicate value '2' encountered with hashcode 50 processor=org.supercsv.cellprocessor.constraint.UniqueHashCode context={lineNo=4, rowNo=4, columnNo=1, rowSource=[2, Lisa, 20, San Franceco]} at org.supercsv.cellprocessor.constraint.UniqueHashCode.execute(UniqueHashCode.java:78) at org.supercsv.util.Util.executeCellProcessors(Util.java:93) at org.supercsv.io.CsvBeanWriter.write(CsvBeanWriter.java:136) at com.theitroad.csv.supercsv.parser.SuperCSVWriterExample.main(SuperCSVWriterExample.java:33)
原因是我们已将id列定义为具有UniqueHashCode约束。
这是一个非常独特且重要的功能,在Java中的所有其他CSV解析器中都没有。