Los
ejemplos de este tutorial están hechos con el siguiente
entorno de desarrollo:
-
Jboss Eclipse
IDE Milestone 5. -
JDK 1.5
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:
como CSV:
Seleccionamos el caracter delimitador y el juego de caracteres:
Una vez guardado, comprobemos lo que es realmente un fichero CSV:
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:
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:
EMPEZANDO A TRABAJAR.
Vamos a empezar a hacer algo interesante. Os
propongo el siguiente programa:
- Leer el
documento CSV creado arriba, - Para cada
palabra, ponerla al revés y rellenar la segunda columna de
cada fila. - 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):
Nos crearemos una clase que nos sirva de base para nuestro programa:
com.autentia.tutoriales.csv.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;iInvoquemos 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):
Invocamos y mostramos 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: escribePalindromospublic 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;iLo invocamos desde main:
…. …. try { palindromo.escribePalindromos(listaPalindromos,fichero,delim); } catch (Exception e) { e.printStackTrace(); }Vamos a comprobar el resultado en el fichero:
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
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
Muchas gracias, mi estimado, la verdad me ayudo bastante.
Te mando saludos desde México…
Hola, ¿como podria aplicarlo para poder autocompletar palabras, corregirlas si estan mal escritas o si le faltan tildes? , Gracias.
¡Buenas!
¿Éste .jar puede utilizarse para csv delimitados por TAB en lugar de por comas?
Un saludo y gracias