viernes, 15 de junio de 2012

En esta ocasión veremos cómo manejar archivos CSV en Java, para lo cual usaremos una de las diversas librerías gratuitas que se encuentran disponibles en la web. Escogí la librería javacsv porque me pareció la mas práctica y sencilla. Puedes descargar la librería con la documentación completa desde aquí. Luego, para usarla, solo tienes que adicionar a tu proyecto Java el archivo javacsv.jar.

Importar datos a una lista desde un archivo CSV


Primero crearemos una clase llamada Usuario con la siguiente estructura:

package dominio;

public class Usuario {

    private String codigo;
    private String nombres;
    private String apellidos;
    private String correo;

    public Usuario(String codigo, String nombres, String apellidos, String correo) {
        setCodigo(codigo);
        setNombres(nombres);
        setApellidos(apellidos);
        setCorreo(correo);
    }

    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public String getNombres() {
        return nombres;
    }

    public void setNombres(String nombres) {
        this.nombres = nombres;
    }

    public String getApellidos() {
        return apellidos;
    }

    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }

    public String getCorreo() {
        return correo;
    }

    public void setCorreo(String correo) {
        this.correo = correo;
    }
}

Luego crearemos un archivo CSV llamado usuarios_import.csv con la siguiente estructura:

Codigo, Nombres, Apellidos, Correo
2001, Jorge Luis, Garcia Sifuentes, jlgarcias@gmail.com
2002, Miguel Jose, Guevara Martinez, mguevara@yahoo.com
2003, Juan Carlos, Mendoza Cruz, jcmendoza@hotmail.com

Luego crearemos una clase que lea el archivo CSV y lo importe a nuestra lista de usuarios, tal como muestra el siguiente código:

package csv.ejemplos;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.csvreader.CsvReader;

import dominio.Usuario;

public class EjemploCsvImportacion {

    public static void main(String[] args) {
    
        try {
        
        List<usuario> usuarios = new ArrayList<usuario>();
        
        CsvReader usuarios_import = new CsvReader("test/usuarios_import.csv");
        usuarios_import.readHeaders();
        
        while (usuarios_import.readRecord())
        {
            String codigo = usuarios_import.get(0);
            String nombres = usuarios_import.get(1);
            String apellidos = usuarios_import.get("Apellidos");
            String correo = usuarios_import.get("Correo");
            
            usuarios.add(new Usuario(codigo, nombres, apellidos, correo));    
        }
        
        usuarios_import.close();
        
        for(Usuario us : usuarios){
        
            System.out.println(us.getCodigo() + " : " + us.getNombres() + " " 
            + us.getApellidos() + " - " + us.getCorreo());
        }
        
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Como podemos apreciar estamos creando una lista usuarios, luego hemos instanciado la clase CsvReader, a la cual le pasamos por parámetro la ruta del archivo CSV que queremos importar. En la línea 21 estamos leyendo la cabecera del archivo CSV, si el archivo no tuviera cabecera podríamos omitir esta línea pero al momento de pasarle los valores de los campos ya no indicaríamos el nombre de la columna (como se muestra en las líneas 27 y 28) sino el índice respectivo (como se muestra en las líneas 25 y 26). Luego hacemos uso del while para recorrer el archivo línea por línea e importar su contenido a nuestra lista de usuarios. Finalmente le indicamos que terminamos de trabajar con el archivo CSV usando el método close(). Luego recorremos la lista usuarios con un for para comprobar que se importaron exitosamente los datos de nuestro archivo CSV.

Este sería el resultado por consola:

2001 : Jorge Luis Garcia Sifuentes - jlgarcias@gmail.com
2002 : Miguel Jose Guevara Martinez - mguevara@yahoo.com
2003 : Juan Carlos Mendoza Cruz - jcmendoza@hotmail.com


Exportar datos de una lista a un archivo CSV


Para este caso, crearemos una clase que contenga el siguiente código:

package csv.ejemplos;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.csvreader.CsvWriter;

import dominio.Usuario;

public class EjemploCsvExportacion {

    public static void main(String[] args) {
    
        List<usuario> usuarios = new ArrayList<usuario>();
        
        usuarios.add(new Usuario("1001","Jose","Ramirez Torres","jramirez89@hotmail.com"));
        usuarios.add(new Usuario("1002","Saul","Gaviria Garcia","sgaviria12@gmail.com"));
        usuarios.add(new Usuario("1003","Maria","Torres Mendoza","mtorres12@yahoo.com"));
        
        String outputFile = "test/usuarios_export.csv";
        boolean alreadyExists = new File(outputFile).exists();
        
        if(alreadyExists){
            File ficheroUsuarios = new File(outputFile);
            ficheroUsuarios.delete();
        }        
        
        try {
        
            CsvWriter csvOutput = new CsvWriter(new FileWriter(outputFile, true), ',');
            
            csvOutput.write("Codigo");
            csvOutput.write("Nombres");
            csvOutput.write("Apellidos");
            csvOutput.write("Correo");
            csvOutput.endRecord();
            
            for(Usuario us : usuarios){
                
                csvOutput.write(us.getCodigo());
                csvOutput.write(us.getNombres());
                csvOutput.write(us.getApellidos());
                csvOutput.write(us.getCorreo());
                csvOutput.endRecord();                   
            }
            
            csvOutput.close();
        
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Aqui podemos apreciar que primero estamos creando nuestra lista de usuarios, a la cual le estamos añadiendo 3 usuarios. Luego definimos la ruta del archivo CSV que crearemos y consultamos si el archivo existe. Si ya existe lo eliminamos. Luego instanciamos la clase CsvWriter, a la cual le pasamos por parámetro la ruta de nuestro archivo CSV a generar. Agregamos la cabecera con los nombres de las columnas que vamos a exportar. Luego hacemos uso el for para recorrer cada elemento de la lista usuarios, en cada iteración escribimos la información que deseamos mostrar en el archivo usando el método write() y terminamos cada línea con el método endRecord(). Finalmente, fuera del for, cerramos con el método close().

El archivo CSV generado quedaría de la siguiente manera:

Codigo,Nombres,Apellidos,Correo
1001,Jose,Ramirez Torres,jramirez89@hotmail.com
1002,Saul,Gaviria Garcia,sgaviria12@gmail.com
1003,Maria,Torres Mendoza,mtorres12@yahoo.com


Espero que este blog haya sido de utilidad para ustedes, pueden descargar el ejemplo completo desde aquí.