Hoy por primera vez y por necesidades del guión, voy a comentar un poco por encima cómo generar un CSV utilizando JAVA y por supuesto cómo parsearlo. La motivación principal de poder exportar una información a un CSV es que el usuario de la aplicación fácilmente tenga una manera de importar dicha información en una hoja de cálculo (LibreOffice.org calc, OpenOffice.org calc o mismamente MS Office Excel).
El CSV por lo general es un tipo de fichero muy sencillo, que incluso casi podría ser generado directamente sin la necesidad de usar una librería intermedio a base de escribir en fichero directamente. En general, consiste en que el fichero tenga la capacidad de representar una tabla, en la cual las celdas se separan por un caracter especial (habitualmente se suele utilizar la coma) y las filas suelen estar separados por saltos de línea. Luego hay diferentes variantes, que cambian la manera de separar filpas y columnas o definen una manera en concreto de encapsular las cadenas de texto (normalmente con comillas).
En Java hay varias soluciones de diferentes autores. Pero con el fin de crear una API común, o más bien tratar de estandarizar el acceso y escritura de CSV la Apache foundation tiene una librería llamada Commons CSV. Commons CSV trata de unificar la API y funcionalidades de Skife CSV, Open CSV y Genjava CSV. Por ello, considero que es la más interesante para utilizar, además de que está disponible en repositorios maven y por separado en los repositorios habituales de las distribuciones de linux (por si te interesa crear paquetes de distribución para facilitar las cosas a los usuarios de linux).
Generando un CSV
Lo primero que se deberá de tener es la información que se pretende introducir en el CSV de manera adecuada. Para ello deberás de buscar la manera de introducir tus datos en un array bidimensional de tipo String. Lo siguiente será instancias un CSVPrinter que necesariamente deberá de ser asociado con un Stream de salida… idealmente un fichero.
Se supone que assistances es una lista de registros de asistencia, que tiene un asistente que contiene los datos de código y nombre. Se registra si es un evento de entrada y de salida (método getType()) y se guarda la marca de tiempo del evento. El ejemplo os servirá para entender facilmente el sencillo proceso de escritura en un CSV.
Si echais un vistazo a la documentación de commons-csv, descubrireis que se puede cambiar la definición de los delimitadores, según necesiteis para generar un csv que os interese para que lo acepten según que programas.
String[][] values;
String destinyPath = "test.csv"; // adecuado vincular esto con algun selector de ficheros
try {
CSVPrinter printer = new CSVPrinter(new FileOutputStream(destinyPath));
values = new String[assistances.size()][CSV_NUM_COLUMNS];
Iterator it = assistances.iterator();
int row = 0;
while (it.hasNext()) {
Assistance assistance = it.next();
values[row][CSV_COLUMN_TYPE] = assistance.getType();
values[row][CSV_COLUMN_CODE] = assistance.getAssistant().getCode();
values[row][CSV_COLUMN_NAME] = assistance.getAssistant().getName();
values[row][CSV_COLUMN_TIME] = assistance.getTimestamp();
}
printer.println(values);
} catch (IOException ioe) {
// lo que veas conveniente con la excepcion
}
Parseando un CSV
Ahora viene justo el proceso contrario, extraer la información que interesa de un CSV. La idea es bastante sencilla en general ya que el CSVParser tiene un método que te permite recuperar directamente un array bidimensional de Strings con el contenido del CSV. Además de que soporta también cambiar los delimitadores para especificar el tipo de formato que tendrá tu CSV de entrada.
try {
String destiny = "test.csv"
CSVParser parser = new CSVParser(new FileReader(destiny));
String values[][] = parser.getAllValues();
// a partir de aqui, eres libre de hacer lo que veas con el array bidimensional.
} catch (IOException ioe) {
// haz los que veas conveniente con la excepcion
}









