Usando regex para formatear SQL

En algunas ocasiones llegue a leer  de regex, también lo estudie (muy poco) para sacar la certificación SCJP y en rara ocasión utilizarlo para alguna validación, aunque sin dudarlo donde mas pude conocer de su potencial fue conversando con colegas de profesión.

En esta oportunidad quiero compartir con ustedes una solución que pude dar a un problema, agilizando (mucho) mi trabajo y facilitando lo que tenia que hacer.

El problema: Un script para la inserción de un gran numero de registros (aproximadamente por el orden de los 16000) que afectaba a varias tablas. Dicho script era producto de una exportación de una BD oracle, la exportación le otorgo a los valores de las fechas un formato especial de la forma {d ‘yyyy-mm-dd’}. Por ejemplo {d ‘2010-09-14’}.

Al ejecutar los script arrojaba un error, ademas de que el formato de la fecha en mi BD local era de la forma ‘dd-mm-yyyy’, entre las soluciones que me aconsejaban era utilizar un editor al estilo notepad++, ultraedit y de esta manera poder eliminar las llaves y la letra d, pero esto no solucionaba totalmente el problema ya que aun estaba de por medio el formato en el que estaba representada la fecha. Fue en ese momento que pensé regex y de toda su potencia y aunque no estaba seguro de que pudiese ser la solución sentí que tenia que darle un vistazo en detalle a las características que podría darme.

Después de visitar algunos sitios web, pude dar con lo que necesitaba y me dispuse a implementar una solución (java) para mi problema, que de antemano se que puede hacerse mas elegante e incluso por que no decirlo, implementarse mejor, pero el entusiasmo que tengo en compartirlo con ustedes hace que no me dedique a refinar mi programa, pero lo que mas deseo que evitar que algún colega tenga que editar 10000 INSERT.

Aquí les dejo el código

Como podrán ver la funcionalidad de este programa consiste en recibir 2 argumentos y en cuyo caso que no los reciba arrojar un mensaje de error. El primer argumento es la ruta donde esta ubicado el fichero SQL y el segundo argumento es el nombre del nuevo fichero SQL que habrá sido formateado.

La clave: El patron regex utilizado.

String patternStr = «\\{[d]\\s\\'(\\d{4})-(\\d{2})-(\\d{2})\\’\\}+»;

Tiene las siguientes características:

  • \\{      busca existe una llave «{«.
  • [d]      seguida de la letra d.
  • \\s      seguido de un espacio en blanco.
  • \\’      busca el carácter «‘» (comilla simple)
  • (\\d{4})-(\\d{2})-(\\d{2})     seguido de 4 dígitos más «-» seguido de 2 dígitos mas «-» y por ultimo 2 dígitos. Como podrán notar los dígitos aparecen dentro de paréntesis, esta es una particularidad de regex que nos permite hacer grupos y esto resulto fundamental para poder resolver el formato de la fecha.
  • \\’    busca el carácter «‘» (comilla simple).
  • \\}    busca el carácter «}».
  • + Nos indica que al buscar este patrón, este puede aparecer en más de una oportunidad.

Por ultimo está la sentencia utilizada para llevar a cabo el reemplazo:

bos.write(line.replaceAll(patternStr, «‘$3-$2-$1′»)+»\n»);

Donde al hallar el patrón, es sustituido por el segundo parametro utilizado «‘$3-$2-$1′», aqui enlazamos con los grupos definidos, ya que eso es a lo que hacen referencia las variables $, donde por ejemplo $1 significa el primer grupo definido  en el patrón que se corresponde con el año, $2 el mes y $3 el día.

Como pudieron ver regex no solo ha de ser utilizado para llevar a cabo validaciones sino que además nos permite utilizarlo para llevar a cabo funciones de formateo y a en mi caso me ahorro editar a mano 15000 registros o en el mejor de los casos hacer un programa Java muy rebuscado trabajando con cadenas.

 

Documental de Arduino

Aqui les dejo el documental de Arduino, espero que lo disfruten tanto como yo, que grande son estos innovadores (para mi mas que soñadores, ya que lo hicieron realidad).

Documental con subtítulos en español

 

Por ultimo aprovechare este medio para solicitarles ayuda, todo material sea tutorial, biblioteca (library), sitio web, etc.. que conozcan, que trate acerca de XBEE explorer serial  en Mac os X y la XBEE communication  shield.

Estos son mis nuevos juguetes que me han regalo con motivo de mi cumpleaños y ya estoy deseoso de hacer algo con ellos.

Lo nuevo en Java 7

Tal como dice el titulo, si deseas conocer algunas de las novedades de Java 7, descárgate de forma gratuita este ebook y accede a el con tu aplicación kindle desde cualquiera de tus dispositivos, ya sea tu computadora, teléfono móvil (celular), tablet o dispositivo kindle.

Mas libros aquí

NOTA: Amazon también proporciona una aplicación Web en HTML5 para visualizar tus ebooks, que al igual que la app nativa te sincroniza tus notas, resaltados y ultima pagina alcanzada en la lectura del libro.

 

Parsing XML con StAX

 

Para muchos es común asociar parsing de documentos XML con DOM o SAX, pero ¿StAX?… no les sonará muy familiar.

¿Qué es StAX?

StAX (Streaming API for XML) es la ultima API en formar parte de la familia JAXP (Java API for XML Processing, conformado por SAX, DOM, StAX y TrAX) y nos provee una alternativa a SAX y DOM para el procesamiento de documentos XML. La principal meta de StAX es otorgarle el control del parseo al programador exponiendo una API basada en un iterador simple. StAX  nos permite lograr un alto rendimiento en la iteración, procesado y modificación de documentos XML sobretodo en entornos donde se disponga de poca cantidad de memoria y limitada capacidad de extensibilidad.

Comparación de StAX con los otras API’s de JAXP

Característica StAX SAX DOM TrAX
Tipo de API Pull, streaming Push, streaming En memoria Regla XSLT
Facilidad de uso Alta Media Alta Media
Capacidad XPath No No Si Si
Eficiencia de CPU y memoria Buena Buena Varia Varia
Solo hacia adelante Si Si No No
Lee XML Si Si Si Si
Escribe XML Si No Si Si
Crear, Leer, Modificar, Borrar No No Si No

Casos de uso de StAX

  • Enlace de datos:

Marshalling/Unmarshalling de un documento XML. Procesamiento de documentos en paralelo y comunicación inalámbrica.

  • Procesamiento SOAP:

Parsing de estructuras simples predecibles, parsing de representaciones de grafos con referencias hacia adelante, parsing de WDSL.

  • Data source virtuales:

Ver datos almacenados en Bases de datos como XML, ver datos en objetos Java creados por enlace de datos XML (xml data binding), parseo de vocabularios XML específicos y procesamiento de XML canalizado.

StAX consta realmente de 2 distintas API:

  • Cursor API: Representa un cursor con el cual se puede ir hacia adelante en un documento XML desde el principio hasta el final. Este cursor puede apuntar un elemento a la vez y siempre se mueve hacia adelante, nunca hacia atrás.
  • Iterator API: Representa un flujo  de un documento XML como un conjunto de objetos de eventos discretos. Estos eventos son sacados por la aplicación y provistos por el parseador en el orden en el cual ellos son leídos en la fuente del documento XML.
Una de las principales diferencias entre ambos estilos es que uno puede aferrarse a los objetos de evento ubicados a principios de XML cuando se usa la Iterator API, cosa que no puede realizarse cuando utilizamos la Cursor API, ya que una vez mueves el cursor hacia el próximo evento, no se tiene información acerca del evento previo. Sin embargo la Cursor API es mas eficiente en cuanto a memoria, así que la selección de que estilo de API utilizar dependerá de las necesidades y limitantes.

Muchos puede que aun tengan la necesidad de un ejemplo practico para tener una idea de donde utilizar StAX. Imaginen un documento XML con todos datos de los empleados de una gran organización de por ejemplo 5000 empleados, el trabajar con DOM implicaría cargar toda esa información en memoria y puede que el sistema no cuente con suficiente recursos para ello, mientras que trabajar con SAX implicaría parsear todo el documento, es aquí donde encaja StAX.

Una vez ya hemos dado algo de teoría, pasamos a la practica.

Dado un XML de empleados, mostrar únicamente aquellos donde el salario sea superior o igual a 30000.

Documento XML

A continuación el código Java elaborado utilizando la Cursor API, asumiendo que estaríamos procesando un documento muy grande con la información de miles de empleados.

la salida final sería la siguiente:

Como han podido ver al realizar (o visualizar) el ejemplo, no resulta complejo utilizar StAX, lo complejo quizás pueda ser el entender como trabajan cada tipo de API y para eso nada mejor que la practica y por eso dejo de parte de ustedes realizar el ejemplo con la Iterator API.

Conclusión

El tratamiento (parsing) de documentos XML hoy en día resulta algo muy común, ya que el XML se esta convirtiendo o de facto ya lo es, el formato por defecto de intercambio de información, como en efecto podemos corroborarlo con los servicios web (tanto SOAP como REST) que establecen su comunicación mediante el envío y recepción de documentos XML, pero la realidad es que aun la cantidad de desarrolladores Java que desconocen o no utilizan StAX resulta muy grande, conviertiendolo en el gran desconocido, cuya consecuencia principal esta en la selección errónea en su lugar de  DOM o SAX  para el tratamiento del XML, cuando digo errónea no me refiero al estilo de programación sino a un mal uso de los recursos, sobretodo en esta época donde la conexión por medio de dispositivos móviles (moviles, pda’s, tablets, etc..) se ha incrementado a pasos agigantados y este es uno de los casos donde el uso de StAX viene como anillo al dedo, pero no resulta el único, ya que también dependiendo del caso (requerimientos y/o limitantes) su uso por ejemplo en un servidor puede resultar en una mejora en el rendimiento, sin que para esto se tenga que recurrir al aumento de recursos (mejor procesador, mas memoria RAM..) del equipo que efectúa el tratamiento del XML.

Información de este post ha sido obtenida del tutorial de Oracle y de jenkov.com

Serialización de objetos Java en XML

JAXB (Java Architecture for XML Binding) nos proporciona una API que nos permite mapear (mapping) entre  documentos XML y objetos Java automaticamente. Será con este framework que llevaremos a cabo la serialización de un objeto Java en un fichero (que será un documento XML) persistiendo el estado del objeto, además de crear un objeto Java a partir de un documento XML (recuperando el estado que tenia dicho objeto al ser serializado).

Crearemos las siguientes clases:

1. Clase Localidad

2. Clase Provincia

Nada fuera de lo normal en estas clases salvo las annotations presentes.

@XmlType: Indica a JAXB que debería generar un tipo de dato XML schema a partir de un tipo de dato Java.

@XmlRootElement: Indica que JAXB debería generar un documento XML (la raíz) a partir de una clase Java

Por ultimo la clase con el main donde se llevará a cabo la serialización/deserialización de los objetos

Como pueden ver resulta bastante sencillo la serialización de objetos a XML, quizás aquí no podamos apreciar todo su potencial, pero les puedo mencionar que es justo esto lo que utiliza el framework jax-ws en los servicios web SOAP con tipos de datos complejos, por supuesto cuando trabajamos con jax-ws no nos percatamos de esto ya que el framework esconde este proceso de convertir los datos XML recibidos en objetos Java y los objetos Java enviados con el cliente del servicio web convertidos a XML (Los servicios web envían XML para de esta manera ser interoperables e independientes de plataformas y lenguajes), siendo transparente para el programador, de esta manera el programador se enfoca en desarrollar la lógica de la aplicación (sea la creación del servicio web o la aplicación que hace uso del cliente del servicio).

Además de esta funcionalidad JAXB también nos ofrece otras herramientas como xjc que nos permite crear clases Java a partir de un XML schema (XSD) y schemagen que lleva a cabo la función inversa, es decir, crear un XML schema (XSD) a partir de una clase Java.