Иногда нужно быстро выгрузить данные в CSV. Например, список пользователей, отчёт или результат диагностики.
Главная ошибка в таких задачах состоит в том, что строки часто просто склеивают через запятую. Это ломается, если внутри значения уже есть запятая, кавычка или перенос строки.
Начнём с модели:
record User(int id, String name, String email) {}Данные могут выглядеть так:
var users = List.of(
new User(1, "Alice", "alice@mail.test"),
new User(2, "Bob, Jr.", "bob@mail.test")
);
Теперь сделаем функцию экранирования. Если значение содержит запятую, кавычку или перенос строки, оборачиваем его в кавычки:
static String csv(String value) {
if (value.contains(",") || value.contains("\"") || value.contains("\n")) {
return "\"" + value.replace("\"", "\"\"") + "\"";
}
return value;
}Для обычных значений функция вернёт строку как есть. Для Bob, Jr. получится корректное CSV-значение в кавычках.
Соберём строку пользователя:
static String row(User user) {
return String.join(",",
String.valueOf(user.id()),
csv(user.name()),
csv(user.email())
);
}Теперь можно собрать весь файл. Сначала добавим заголовок:
var lines = new ArrayList<String>();
lines.add("id,name,email");
После этого добавим строки данных:
for (User user : users) {
lines.add(row(user));
}И запишем результат в файл:
Files.write(
Path.of("users.csv"),
lines,
StandardCharsets.UTF_8
);
На выходе получится корректный CSV:
id,name,email
1,Alice,alice@mail.test
2,"Bob, Jr.",bob@mail.test
Такую заготовку можно использовать для небольших экспортов без внешних библиотек. Если появляются вложенные структуры, разные форматы дат, большие файлы или сложные правила, лучше взять полноценную CSV-библиотеку.
👉 Java Ready | #практика