EN · DE · RU · FR · ES

#1877: CSVWriter.java

projectforge-common/src/main/java/org/projectforge/common/CSVWriter.java Clase de utilidad — paquete org.projectforge.common, projectforge-common/src/main/java/org/projectforge/common/CSVWriter.java 176 líneas · 100 código · 54 comentarios · 22 en blanco
Escritor de salida CSV que formatea datos en archivos de texto delimitados por punto y coma. Complemento de CSVParser — proporciona una API fluida de tipo builder para escribir filas CSV con comillas adecuadas. Soporta sobrecargas de write() tipadas para cadenas (con escape de comillas dobles), enteros largos, fechas (formato ISO 8601) y objetos genéricos. Carácter separador, final de línea y formato de fecha configurables. Se utiliza para exportaciones de datos de ProjectForge (listas de direcciones, exportaciones de hojas de tiempo, informes financieros).

Arquitectura

Importaciones

Configuración

ConfiguraciónValor por defectoMétodo setter
Separador CSV';' (punto y coma — convención europea)setCsvSeparator(char)
Final de línea"\n" (nueva línea Unix)setCr(String)
Formato de fecha"yyyy-MM-dd HH:mm:ss.SSS"setDateFormat(DateFormat)
Zona horaria de fechaUTCCodificada en el constructor

API fluida de tipo Builder

Todos los métodos write() devuelven this (la instancia de CSVWriter), permitiendo encadenamiento de métodos:

csvWriter.write("Nombre").write("Edad").write(42L).writeEndOfLine();

Sobrecargas de escritura específicas por tipo

MétodoFormateoComillas
write(String s)Cadena sin procesar con escape de " a "" (duplicación)Siempre envuelto en "..." — sigue las reglas de comillas RFC 4180
write(long value)Salida numérica directa mediante PrintWriter.print()Ninguna — los números no llevan comillas
write(Date value)Formateado mediante dateFormat.format() en UTCEnvuelto en comillas — las fechas pueden contener espacios o caracteres especiales
write(Object value)Alternativa: String.valueOf(value)Ninguna — los objetos genéricos no llevan comillas (riesgoso para objetos con comas/comillas)

Algoritmo de comillas (escritura de cadenas)

El método write(String) implementa el escape CSV adecuado según RFC 4180:

  1. Genera el separador si no es la primera entrada en la fila (gestionado por writeSeparator() con el indicador firstEntry)
  2. Genera una comilla doble de apertura (")
  3. Itera a través de cada carácter de la cadena
  4. Si el carácter es una comilla doble ("), lo genera dos veces ("") — la secuencia de escape CSV estándar
  5. Genera todos los demás caracteres tal cual
  6. Genera una comilla doble de cierre (")

Escritura de líneas

Lógica del separador (writeSeparator)

El indicador booleano firstEntry rastrea si estamos al inicio de una línea:

Este es un patrón clásico de seguimiento de estado para salida delimitada.

Integración con CSVParser

CSVWriter define DEFAULT_CSV_SEPARATOR_CHAR = ';' como una constante pública, a la que CSVParser hace referencia para garantizar un separador predeterminado coherente entre el lector y el escritor.

Comparación con bibliotecas CSV modernas

Esta implementación es intencionalmente mínima en comparación con Apache Commons CSV u OpenCSV:

La simplicidad refleja su origen como una herramienta creada específicamente para la exportación de datos de ProjectForge, no una biblioteca CSV de propósito general.

El método write(Object) NO pone comillas en la salida — llama a String.valueOf(value) y escribe directamente. Si el toString() del objeto devuelve una cadena que contiene comas, punto y coma o nuevas líneas, el CSV resultante estará mal formado. Esto es aceptable porque se espera que los llamadores utilicen las sobrecargas específicas de tipo.
La salida de fecha utiliza la zona horaria UTC — las fechas se normalizan a UTC antes de formatear. Esta es una elección deliberada para el intercambio de datos: evita la ambigüedad de zona horaria en las exportaciones. El formato "yyyy-MM-dd HH:mm:ss.SSS" es similar a ISO 8601 pero utiliza un separador de espacio en lugar de 'T'.

Historial de Git

868d6abb7 2025 -> 2026
63081666f Encabezados de archivos fuente: 2024 -> 2025.
a73905c14 Corregir errores tipográficos en directorios projectforge*/ Encontrado con codespell
b6092df09 Copyright 2023 -> 2024
ab45d51fa Copyright 2001-2022 -> 2001-2023.
5f7ef41b8 Copyright 2021 -> 2022
ceb63e8a1 Encabezado de código fuente: (C) 2001-2021.
7c79f1922 Copyright del encabezado fuente -> 2020.