Trabajar con ficheros CSV

4
91684
TRABAJAR CON FICHEROS CSV


Los
ejemplos de este tutorial están hechos con el siguiente
entorno de desarrollo:

  • Jboss Eclipse
    IDE Milestone 5.

  • JDK 1.5

Muchas
veces necesitamos trabajar con documentos en forma de filas y columnas,
como fuentes de datos. Podemos para ello usar documentos excel y
utilizar alguna librería como POI para procesarlos. Sin
embargo,
a veces no es necesario complicar tanto las cosas y podemos usar
formatos de ficheros mas sencillos como los ficheros CSV (comma
separated values). En la Wikipedia dan esta definición de
CSV:

«Los
ficheros
CSV (del inglés comma-separated values) son
un tipo de documento sencillo para representar datos en forma de tabla,
en las que las columnas se separan por comas y las filas por saltos de
línea. Los campos que contengan una coma, un salto de
línea o una
comilla doble deben ser encerrados entre comillas dobles.»

Podemos usar cualquier
editor de
textos para generar este tipo de documentos, incluso también
otros programas de hojas de cálculo (excel, openoffice
calc…)
Además, como norma se usa como delimitador el caracter coma,
aunque se puede usar otro caracter como separador.

Vamos por lo tanto a generarnos nuestro primer  documento CSV.
Yo lo voy a hacer con OpenOffice:

Fichero CSV


Vamos a guardar el documento
como CSV:

Guardar como CSV

Seleccionamos el caracter delimitador y el juego de caracteres:

Seleccionamos forma de guardarlo

Una vez guardado, comprobemos lo que es realmente un fichero CSV:

CSV en bloc de notas

Se puede comprobar que un documento CSV no es más que un
fichero
de texto, donde se separan las columnas por un caracter delimitador y
las filas por un salto de línea.

Sería sencillo generarnos nuestro propio código
para
tratar este tipo de ficheros, pero…¿Es necesario
reinventar la
rueda?.

Buscando en google, he encontrado este enlace:

http://sourceforge.net/projects/javacsv/

Aqui podemos encontrar una sencilla librería java para
tratar este tipo de ficheros. Vamos a probarla:

Descargamos la librería javacvs

Descomprimimos en algun lugar del disco y encontramos la
documentación de la librería y el fichero con los
binarios: csv.jar

Os recomiendo echar un vistazo a la
documentación (index.html), no perderéis mucho
tiempo porque son dos clases:

Javadoc

EMPEZANDO A TRABAJAR.

Vamos a empezar a hacer algo interesante. Os
propongo el siguiente programa:

  1. Leer el
    documento CSV creado arriba,
  2. Para cada
    palabra, ponerla al revés y rellenar la segunda columna de
    cada fila.
  3. Comprobar si
    cada palabra es
    palíndroma (se lee igual de derecha a izquierda que de
    izquierda
    a derecha) y rellenar la tercera columna con el resultado.

Para empezar, abriremos
eclipse y crearemos un proyecto java nuevo (yo le he llamado
PALINDROMOS).

Añadiremos al CLASSPATH de nuestro proyecto la
librería javacvs (cvs.jar):

Configuramos el classpath

Nos crearemos una clase que nos sirva de base para nuestro programa:

com.autentia.tutoriales.csv.Palindromos:

Creamos la clase Palindromos

Nos vamos a crear otra clase que representará un fila en el
fichero CSV. La vamos a denominar VOPalindromo, a
continuación
os muestro el código:

public class VOPalindromo implements Serializable {
    private String palabra;
    private String reves;
    private boolean palindromo;
    
    public String getPalabra() {
        return palabra;
    }
    public void setPalabra(String palabra) {
        this.palabra = palabra;
    }
    public boolean isPalindromo() {
        return palindromo;
    }
    public void setPalindromo(boolean palindromo) {
        this.palindromo = palindromo;
    }
    public String getReves() {
        return reves;
    }
    public void setReves(String reves) {
        this.reves = reves;
    }    
    
}

Vamos
a escribir ahora
un método en la clase Palindromos que lea todas las palabras
del
fichero CSV, calcule si cada palabra es palíndromo
(capicúa) y las almacene en memoria:


/**
     * Lee el fichero CSV llamado pathFichero, usando como delimitador de 
     * columnas: “delimitador” y crea una lista en memoria de 
     * Objetos de tipo VOPalindromo
     * @param pathFichero
     * @param delimitador
     * @return
 */
    
    public List leePalindromos(String pathFichero, String delimitador)
    throws Exception {  
    
        CsvReader cvsReader = null;

       try {
       File fichero = new File(pathFichero);
       FileReader freader = new FileReader(fichero);        
      cvsReader = new CsvReader(freader,delimitador.charAt(0));       
       String[] headers = null;            
       List listaRegistros = new ArrayList();
     // Leemos las cabeceras del fichero (primera fila).
       if(cvsReader.readHeaders()) {
            headers = cvsReader.getHeaders(); 
        System.out.println(“——- CABECERAS DEL FICHERO ————“);
            for(int i=0;i

Invoquemos al método desde main:

public static void main(String[] args) {    
        
    // Obtenemos el fichero y el delimitador
    String fichero = args[0];
    String delim = args[1];
    
    Palindromos palindromo = new Palindromos();
    
    List listaPalindromos = null;
    try {
        listaPalindromos=palindromo.leePalindromos(fichero,delim);
    } catch (Exception e) {            
        e.printStackTrace();
    }
}

Ejecutemos
el código (no olvidar pasárle los parametros a
main):

Parametros a main

Invocamos y mostramos la
consola:

Resultado en la consola

Bueno, tan sólo nos falta la parte de almacenar los
resultados
en el fichero CSV. Nos crearemos otro método en la clase
Palindromos al que llamaremos: escribePalindromos

public void escribePalindromos(List listaPalindromos,String pathFichero, String delimitador) throws Exception {
    CsvWriter writercsv = null;    
    
    try {
        File fichero = new File(pathFichero);
        FileWriter fwriter = new FileWriter(fichero);
        
        // Creamos la clase que nos permite escribir en el fichero CSV.
        writercsv = new CsvWriter(fwriter,delimitador.charAt(0));
        
        // Escribimos las cabeceras.
        writercsv.write(“PALABRA”);
        writercsv.write(“AL REVES”);
        writercsv.write(“¿ ES PALÍNDROMO ?”);
        writercsv.endRecord();
        
        // Escribimos los resultados.
        for(int i=0;i

Lo invocamos desde main:

….
….

try {
        palindromo.escribePalindromos(listaPalindromos,fichero,delim);
 } catch (Exception e) {            
        e.printStackTrace();
 }

Vamos a comprobar el resultado en el fichero:

Resultado de la prueba

Ha sido sencillo ¿ verdad ?.

Os comento que hay gran cantidad de librerías para tratar
ficheros CSV, esta es una más y funciona bien.
También
podéis generaros vuestra propia librería, ya que
los
ficheros CSV como habéis visto son muy sencillos de tratar.

Si necesitáis ayuda, ya sabéis donde
encontrarnos: http://www.autentia.com


4 COMENTARIOS

  1. Hola, implemente el previo codigo pero me sale este error a la hora de correrlo.

    Exception in thread \\\»main\\\» java.lang.ArrayIndexOutOfBoundsException: 1
    at paquete_palindromos.Main.main(Main.java:23)

    por que sera, estoy usando Netbeans y es algo diferente pero igual tiene la opcion para pasar los parametros al main. gracias

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad