OpenCSV, как писать в csv с кастомной обработкой? - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь записать список объектов 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 Ответ

2 голосов
/ 11 июля 2020

Вы можете использовать аннотации @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"
...