隨着項目上線,暫時處於閒置狀態,所以趁閒帶着團隊對在這一年項目中做的比較好的組件,工具和實踐總結和抽取出來,在我後續的隨筆中將會陸續發佈出來。今天主要是一個簡單的maven小組件,對opencsv基於Annotation簡單的封裝,使得我們可以輕易的將CSV文件轉化爲List對像和把List對像導出爲CSV文件。
項目託管地址於github https://github.com/greengerong/opencsv-utils。
對於代碼就不用多說了,簡單看看如何使用。
Object
package opencsv.utils;
public class Person {
private int id;
@Csv("person name")
private String name;
@Ignore
private int age;
public Person(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public Person() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Mapping會自動將沒有ignore的字段作爲CSV的映射屬性名作爲CSV列頭,如果針對特殊列則可以標記@CSV解決。
1: 讀取CSV:
(1) 基於Annotation映射方式
@Test
public void shouldGetPersonFromCSV() throws Exception {
StringReader reader = new StringReader("id,person name\n1,name1\n2,name2\n");
List<Person> personList = personCsvMapper
.withMapping("id", "id")
.withMapping("person name", "name")
.fromCsv(reader);
assertThat(personList.size(), is(2));
final Person first = personList.get(0);
assertThat(first.getId(), is(1));
assertThat(first.getName(), is("name1"));
final Person second = personList.get(1);
assertThat(second.getId(), is(2));
assertThat(second.getName(), is("name2"));
}
(2) 自定義映射方式
@Test
public void shouldToCsv() throws Exception {
personCsvMapper.withMapping(new CsvColumnMapping(Person.class));
final ArrayList<Person> list = new ArrayList<Person>();
list.add(new Person(1, "name1", 20));
list.add(new Person(2, "name2", 30));
final StringWriter writer = new StringWriter();
personCsvMapper.toCsv(writer, list);
final String text = writer.toString();
assertThat(text, is("id,person name\n1,name1\n2,name2\n"));
}
2: CSV輸出
@Test
public void shouldGetPersonFromCsv() throws Exception {
StringReader reader = new StringReader("id,person name\n1,name1\n2,name2\n");
List<Person> personList = new CsvMapper<Person>(Person.class)
.withMapping(new CsvColumnMapping(Person.class))
.fromCsv(reader);
assertThat(personList.size(), is(2));
final Person first = personList.get(0);
assertThat(first.getId(), is(1));
assertThat(first.getName(), is("name1"));
final Person second = personList.get(1);
assertThat(second.getId(), is(2));
assertThat(second.getName(), is("name2"));
}
最後在累贅下託管地址:https://github.com/greengerong/opencsv-utils。其他的相比不用再說了。