OpenCSV,如何写入自定义处理的csv?
OpenCSV, how to write into csv with custom processing?
我正在尝试将 POJO 对象列表写入 csv。我使用 opencsv,代码非常少:
StatefulBeanToCsv sbc = new StatefulBeanToCsvBuilder(writer)
.withSeparator(CSVWriter.DEFAULT_SEPARATOR)
.build();
我在阅读时使用自定义转换器,我也可以为写作做类似的事情吗?
例如:
- 如果字段是列表类型,它被写为“[a,b]”。但是我
想做这样的事情:“a,b”。
- 一个字段是LocalDataTime类型的,我想写成格式“MM/dd/yyyy”
并在输出 csv 中完全丢弃时间。
我希望输出是这样的:
date of issue,items
"02/22/2020","a,b"
而不是:
date of issue,items
"2020-02-22T00:00","[a,b]"
非常感谢,感谢任何帮助
:)
您可以使用注释 @CsvDate
设置自定义日期格式,使用 @CsvBindAndSplitByName
将列表转换为字符串。
请找到以下示例:
import static java.time.temporal.ChronoUnit.MONTHS;
import com.opencsv.CSVWriter;
import com.opencsv.bean.CsvBindAndSplitByName;
import com.opencsv.bean.CsvBindByName;
import com.opencsv.bean.CsvDate;
import com.opencsv.bean.StatefulBeanToCsv;
import com.opencsv.bean.StatefulBeanToCsvBuilder;
import java.io.FileWriter;
import java.io.Writer;
import java.time.LocalDateTime;
import java.util.List;
public class Main {
public static void main(String[] args) throws Exception {
Writer writer = new FileWriter("example.csv");
StatefulBeanToCsv<Item> sbc = new StatefulBeanToCsvBuilder<Item>(writer)
.withSeparator(CSVWriter.DEFAULT_SEPARATOR)
.build();
List<Item> items = List.of(
new Item(LocalDateTime.now().minus(4, MONTHS), List.of("1", "s")),
new Item(LocalDateTime.now().minus(1, MONTHS), List.of("1", "d")),
new Item(LocalDateTime.now().minus(3, MONTHS), List.of("1", "2", "3"))
);
sbc.write(items);
writer.close();
}
public static class Item {
@CsvBindByName(column = "date")
@CsvDate(value = "yyyy-MM-dd'T'hh:mm")
private LocalDateTime date;
@CsvBindAndSplitByName(column = "list", elementType = String.class, writeDelimiter = ",")
private List<String> array;
Item(LocalDateTime date, List<String> array) {
this.date = date;
this.array = array;
}
public LocalDateTime getDate() {
return date;
}
public void setDate(LocalDateTime date) {
this.date = date;
}
public List<String> getArray() {
return array;
}
public void setArray(List<String> array) {
this.array = array;
}
}
}
example.csv
的输出:
"DATE","LIST"
"2020-03-10T02:37","1,s"
"2020-06-10T02:37","1,d"
"2020-04-10T02:37","1,2,3"
我正在尝试将 POJO 对象列表写入 csv。我使用 opencsv,代码非常少:
StatefulBeanToCsv sbc = new StatefulBeanToCsvBuilder(writer)
.withSeparator(CSVWriter.DEFAULT_SEPARATOR)
.build();
我在阅读时使用自定义转换器,我也可以为写作做类似的事情吗? 例如:
- 如果字段是列表类型,它被写为“[a,b]”。但是我 想做这样的事情:“a,b”。
- 一个字段是LocalDataTime类型的,我想写成格式“MM/dd/yyyy” 并在输出 csv 中完全丢弃时间。
我希望输出是这样的:
date of issue,items
"02/22/2020","a,b"
而不是:
date of issue,items
"2020-02-22T00:00","[a,b]"
非常感谢,感谢任何帮助 :)
您可以使用注释 @CsvDate
设置自定义日期格式,使用 @CsvBindAndSplitByName
将列表转换为字符串。
请找到以下示例:
import static java.time.temporal.ChronoUnit.MONTHS;
import com.opencsv.CSVWriter;
import com.opencsv.bean.CsvBindAndSplitByName;
import com.opencsv.bean.CsvBindByName;
import com.opencsv.bean.CsvDate;
import com.opencsv.bean.StatefulBeanToCsv;
import com.opencsv.bean.StatefulBeanToCsvBuilder;
import java.io.FileWriter;
import java.io.Writer;
import java.time.LocalDateTime;
import java.util.List;
public class Main {
public static void main(String[] args) throws Exception {
Writer writer = new FileWriter("example.csv");
StatefulBeanToCsv<Item> sbc = new StatefulBeanToCsvBuilder<Item>(writer)
.withSeparator(CSVWriter.DEFAULT_SEPARATOR)
.build();
List<Item> items = List.of(
new Item(LocalDateTime.now().minus(4, MONTHS), List.of("1", "s")),
new Item(LocalDateTime.now().minus(1, MONTHS), List.of("1", "d")),
new Item(LocalDateTime.now().minus(3, MONTHS), List.of("1", "2", "3"))
);
sbc.write(items);
writer.close();
}
public static class Item {
@CsvBindByName(column = "date")
@CsvDate(value = "yyyy-MM-dd'T'hh:mm")
private LocalDateTime date;
@CsvBindAndSplitByName(column = "list", elementType = String.class, writeDelimiter = ",")
private List<String> array;
Item(LocalDateTime date, List<String> array) {
this.date = date;
this.array = array;
}
public LocalDateTime getDate() {
return date;
}
public void setDate(LocalDateTime date) {
this.date = date;
}
public List<String> getArray() {
return array;
}
public void setArray(List<String> array) {
this.array = array;
}
}
}
example.csv
的输出:
"DATE","LIST"
"2020-03-10T02:37","1,s"
"2020-06-10T02:37","1,d"
"2020-04-10T02:37","1,2,3"