OpenCSV,如何使用自定义处理功能写入csv?

时间:2020-07-10 20:13:44

标签: java spring-boot opencsv

我正在尝试将POJO对象列表写入csv。我使用opencsv,代码非常少:

 StatefulBeanToCsv sbc = new StatefulBeanToCsvBuilder(writer)
                    .withSeparator(CSVWriter.DEFAULT_SEPARATOR)
                    .build();

我在阅读时使用自定义转换器,我还能在写时做类似的事情吗? 例如:

  1. 如果字段的类型为List,则将其写为“ [a,b]”。但是我 想要做这样的事情:“ a,b”。
  2. 一个字段的类型为LocalDataTime,我想以“ MM / dd / yyyy”格式编写 并完全在输出csv中丢弃时间。

我希望输出是这样的:

date of issue,items
"02/22/2020","a,b"

代替:

date of issue,items
"2020-02-22T00:00","[a,b]"

非常感谢,感谢您的帮助 :)

1 个答案:

答案 0 :(得分:2)

您可以使用注释@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"