Преобразование List<Pojo> в строку CSV с заголовками

Я надеюсь, что кто-то может помочь со следующим: У меня есть массив

List<Transaction> transactions; 

с полями:

private String firmId; 
private String accountId; 
private String symbol; 
private long quantity;

Я хочу преобразовать его в следующую строку в формате CSV:

firmId,AccountId,symbol, quantity
1234,ACCOUNT1,AAPL,100
1234,ACCOUNT1,AMZN,200
2345,ACCOUNT3,AAPL,400

Есть ли эффективный и простой способ сделать это на Java? Поскольку я не хочу использовать OpenCSV и записывать его в файл. Мне также не нравится возможность использовать абстракцию.

Мне нужно использовать CSVString в моей программе в качестве полезной нагрузки для другого запроса. Количество объектов в Списке может достигать 2000.

Спасибо!

по сути, вам просто нужен список со строками? "строка заголовка" + forEach(line.toString()); должен это сделать, в зависимости от вашей реализации toString()

Stultuske 09.04.2024 11:55

Если вы не хотите использовать библиотеку, вам, вероятно, придется реализовать ее самостоятельно. Однако есть несколько отличных библиотек, которые могут сделать эту работу за вас.

vatbub 09.04.2024 11:56

если вы уже знаете, что это будут только эти 4 поля, вы можете реализовать toString, который соединяет поля запятыми, а затем просто используйте цикл for для его преобразования

BIBOO unit 09.04.2024 11:56

Вы просите какой-нибудь POJO? Или специально для занятий Transaction?

Abra 09.04.2024 12:00

@Abra, в частности класс Transaction, и результирующая строка в формате CSV, которую я опубликовал.

MtlTechGuy 09.04.2024 12:02

Тогда я думаю, что комментарий @BIBOOnation — это то, что вам нужно.

Abra 09.04.2024 12:04

«Мне также не нравится возможность использовать абстракцию». - Объясните, почему? Если это только для простого случая, подобного тому, который вы опубликовали, вам может не понадобиться никакая библиотека. Но если вашим данным может потребоваться экранирование и т. д., то их создание самостоятельно может оказаться более вредным, чем использование хорошо протестированной библиотеки, обеспечивающей некоторую форму абстракции. Или вы имеете в виду какую-то другую форму абстракции?

Thomas 09.04.2024 12:10

Почему бы не использовать OpenCSV без записи в файлы?

aled 09.04.2024 13:48

@aled, как это будет работать в качестве примера? Можете ли вы закончить пример строки, которую я опубликовал?

MtlTechGuy 09.04.2024 14:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
9
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы получить желаемую строку, указанную в вашем вопросе, я предлагаю следующее:

  1. Переопределить метод toString в классе Transaction, чтобы он возвращал конкатенацию значений всех атрибутов экземпляра Transaction, разделенных запятыми.
  2. Создайте экземпляр StringBuilder и добавьте желаемый заголовок, т. е. firmId,AccountId,symbol, quantity.
  3. Перебирайте список экземпляров Transaction, вызывая метод toString для каждого экземпляра и добавляя результат к StringBuilder.

Вуаля, вы получили желаемый результат.

Приведенный ниже код также обрабатывает атрибуты со значениями NULL и добавляет символы новой строки, т. е. \n, где это необходимо.

import java.util.List;

public class Transaction {
    private String firmId; 
    private String accountId; 
    private String symbol; 
    private long quantity;

    public Transaction(String firmId, String accountId, String symbol, long quantity) {
        this.firmId = firmId;
        this.accountId = accountId;
        this.symbol = symbol;
        this.quantity = quantity;
    }

    @Override
    public String toString() {
        String firm = firmId == null ? "" : firmId;
        String acct = accountId == null ? "" : accountId;
        String smbl = symbol == null ? "" : symbol;
        return firm + "," + acct + "," + smbl + "," + quantity;
    }

    public static void main(String[] args) {
        
        List<Transaction> list = List.of(new Transaction("1234","ACCOUNT1","AAPL",100),
                                         new Transaction("1234","ACCOUNT1","AMZN",200),
                                         new Transaction("2345","ACCOUNT3","AAPL",400));
        StringBuilder sb = new StringBuilder("firmId,AccountId,symbol, quantity\n");
        list.forEach(t -> sb.append(t + "\n"));
        System.out.println(sb);
    }
}

Вывод при запуске приведенного выше кода:

firmId,AccountId,symbol, quantity
1234,ACCOUNT1,AAPL,100
1234,ACCOUNT1,AMZN,200
2345,ACCOUNT3,AAPL,400

РЕДАКТИРОВАТЬ

Вы также можете использовать API потока – вместо метода forEach.
(Обратите внимание, что Transaction::toString — это ссылка на метод.)

StringBuilder sb = new StringBuilder("firmId,AccountId,symbol, quantity\n");
sb.append(list.stream()
              .map(Transaction::toString)
              .collect(Collectors.joining("\n")));

Спасибо, это отлично работает и создает необходимую мне полезную нагрузку!

MtlTechGuy 09.04.2024 14:05

Другие вопросы по теме