CSVWriter.javawrite() для строк (с экранированием двойных кавычек), целых чисел long, дат (формат ISO 8601) и общих объектов. Настраиваемый символ-разделитель, окончание строки и формат даты. Используется для экспорта данных ProjectForge (списки адресов, экспорт табелей, финансовые отчёты).java.io.PrintWriter / java.io.Writer — Текстовый выводjava.text.DateFormat / SimpleDateFormat — Форматирование дат для CSV-колонок с датамиjava.util.Date — Тип значения датыjava.util.TimeZone — Часовой пояс UTC для форматирования дат| Настройка | По умолчанию | Сеттер |
|---|---|---|
| Разделитель CSV | ';' (точка с запятой — европейская конвенция) | setCsvSeparator(char) |
| Окончание строки | "\n" (перевод строки Unix) | setCr(String) |
| Формат даты | "yyyy-MM-dd HH:mm:ss.SSS" | setDateFormat(DateFormat) |
| Часовой пояс даты | UTC | Жёстко задан в конструкторе |
Все методы write() возвращают this (экземпляр CSVWriter), что позволяет выстраивать цепочки вызовов:
csvWriter.write("Имя").write("Возраст").write(42L).writeEndOfLine();
| Метод | Форматирование | Экранирование |
|---|---|---|
write(String s) | Исходная строка с экранированием " в "" (удвоение) | Всегда обёрнуто в "..." — следует правилам экранирования RFC 4180 |
write(long value) | Прямой числовой вывод через PrintWriter.print() | Нет — числа без кавычек |
write(Date value) | Форматируется через dateFormat.format() в UTC | Обёрнуто в кавычки — даты могут содержать пробелы или спецсимволы |
write(Object value) | Запасной вариант: String.valueOf(value) | Нет — общие объекты без кавычек (рискованно для объектов с запятыми/кавычками) |
Метод write(String) реализует правильное экранирование CSV согласно RFC 4180:
writeSeparator() с флагом firstEntry)")"), выводит её дважды ("") — стандартная escape-последовательность CSV")writeLine(Object[] values) — Записывает все значения из массива, затем вызывает writeEndOfLine()writeEndOfLine() — Выводит настроенное окончание строки (по умолчанию \n) и сбрасывает firstEntry = trueБулев флаг firstEntry отслеживает, находимся ли мы в начале строки:
firstEntry == true: устанавливается в false (первая ячейка — разделитель не нужен)firstEntry == false: перед значением ячейки выводится символ-разделительCSVWriter определяет DEFAULT_CSV_SEPARATOR_CHAR = ';' как публичную константу, на которую ссылается CSVParser для обеспечения согласованного разделителя по умолчанию между читателем и писателем.
Эта реализация намеренно минималистична по сравнению с Apache Commons CSV или OpenCSV:
CSVParser.parseHeadCols())write(Object) НЕ экранирует вывод — он вызывает String.valueOf(value) и записывает напрямую. Если toString() объекта возвращает строку, содержащую запятые, точки с запятой или переводы строк, результирующий CSV будет повреждён. Это приемлемо, поскольку ожидается, что вызывающие будут использовать типизированные перегрузки."yyyy-MM-dd HH:mm:ss.SSS" похож на ISO 8601, но использует пробел в качестве разделителя вместо 'T'.868d6abb7 2025 -> 2026 63081666f Заголовки исходных файлов: 2024 -> 2025. a73905c14 Исправление опечаток в директориях projectforge*/ Найдено через codespell b6092df09 Авторские права 2023 -> 2024 ab45d51fa Авторские права 2001-2022 -> 2001-2023. 5f7ef41b8 Авторские права 2021 -> 2022 ceb63e8a1 Заголовок исходного кода: (C) 2001-2021. 7c79f1922 Авторские права в заголовке исходника -> 2020.