Я надеюсь, что кто-то может помочь со следующим: У меня есть массив
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.
Спасибо!
Если вы не хотите использовать библиотеку, вам, вероятно, придется реализовать ее самостоятельно. Однако есть несколько отличных библиотек, которые могут сделать эту работу за вас.
если вы уже знаете, что это будут только эти 4 поля, вы можете реализовать toString, который соединяет поля запятыми, а затем просто используйте цикл for для его преобразования
Вы просите какой-нибудь POJO? Или специально для занятий Transaction?
@Abra, в частности класс Transaction, и результирующая строка в формате CSV, которую я опубликовал.
Тогда я думаю, что комментарий @BIBOOnation — это то, что вам нужно.
«Мне также не нравится возможность использовать абстракцию». - Объясните, почему? Если это только для простого случая, подобного тому, который вы опубликовали, вам может не понадобиться никакая библиотека. Но если вашим данным может потребоваться экранирование и т. д., то их создание самостоятельно может оказаться более вредным, чем использование хорошо протестированной библиотеки, обеспечивающей некоторую форму абстракции. Или вы имеете в виду какую-то другую форму абстракции?
Почему бы не использовать OpenCSV без записи в файлы?
@aled, как это будет работать в качестве примера? Можете ли вы закончить пример строки, которую я опубликовал?




Чтобы получить желаемую строку, указанную в вашем вопросе, я предлагаю следующее:
toString в классе Transaction, чтобы он возвращал конкатенацию значений всех атрибутов экземпляра Transaction, разделенных запятыми.StringBuilder и добавьте желаемый заголовок, т. е. firmId,AccountId,symbol, quantity.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")));
Спасибо, это отлично работает и создает необходимую мне полезную нагрузку!
по сути, вам просто нужен список со строками? "строка заголовка" + forEach(line.toString()); должен это сделать, в зависимости от вашей реализации toString()