TGViewer
Java Ready | Программирование Java Ready | Программирование @java_ready · 9.26K subscribers
Post #2246 443
Делаем простой CSV exporter на Java!

Иногда нужно быстро выгрузить данные в 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 | #практика
  • 👍 3
  • ❤ 2
  • 🔥 2
More from @java_ready
  1. Oct 12, 2026🗂 Пакет Безопасности — папка, которую админ собирал более 10 лет ⚡️ Слитые курсы по IT и…
  2. Oct 12, 2026Проверяем обновления через ETag в Java! Когда приложение часто запрашивает один ресурс, не…
  3. Oct 9, 2026photo post
  4. Oct 8, 2026Почему String.format может заменить точку на запятую? Представим, что программа сохраняет…
  5. Oct 7, 2026Почему split(".") в Java не делит строку по точке? На первый взгляд кажется, что достаточн…
  6. Oct 6, 2026Безопасная настройка retry для всей системы! В статье Java-разработчик делится опытом внед…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →