Saltar al contenido principal

Búsqueda de datos

En Linux (y Unix en general), solemos disponer del comando grep para realizar búsquedas en archivos. Esto funciona muy bien cuando los archivos que contienen los datos son de texto plano, lo cual no es el caso para archivos IPM

Por ejemplo, sabemos que en alguno de estos archivos hay compras en un local llamado “Carpinteria”, pero no sabemos en cual de ellos están esas transacciones.

Primero, intentemos utilizar el comando grep del sistema:

Intento con grep del sistema

Como podemos observar, no obtenemos ningún resultado, y grep nos devuelve el valor 1 indicando que no pudo efectuar búsquedas en archivos “binarios” Podemos, por supuesto, abrir el archivo con un editor hexadecimal y realizar ahí la búsqueda. Probemos ver

Podemos, por supuesto, abrir el archivo con un editor hexadecimal y realizar ahí la búsqueda.

Probemos ver si podemos utilizar hexdump desde la linea de comandos:

Editor hexadecimal

No parece contener algo que sea facilmente legible, pero cual es el problema? Vemos que la codificación es EBCDIC, por lo que si bien podemos ver los valores de los bytes, no contienen una representación sencilla en ASCII. Claro que podríamos convertirlo primero a ASCII y luego usar hexdump, pero cuando tenemos muchos archivos, eso no es una opción muy practica.

Intentemos utilizar otra herramienta, en este caso una herramienta grafica (ya que en Windows también existen editores en hexadecimal gráficos):

Herramienta gráfica de búsqueda

Ahora, al cambiar la codificación a EBCDIC, comenzamos a ver valores que pueden llegar a identificarse. Sin embargo, esta opción requiere ir abriendo uno por uno los archivos para efectuar las búsquedas, y cuando necesitamos buscar algo mas especifico, que no sea solamente una cadena de caracteres, la situación tampoco mejora mucho.

Veamos entonces como podemos utilizar la herramienta para realizar búsquedas en archivos IPM.

Como dijimos anteriormente, comenzamos buscando los archivos que contienen transacciones realizadas en un comercio que contiene la palabra “carpinteria” en su nombre. Sabemos que el nombre del comercio viene en el campo DE043, pero vamos a comenzar haciendo una búsqueda global

Para ello, invocamos la herramienta con el comando GREP, indicando primero el criterio de búsqueda y luego el o los archivos donde efectuar dicha búsqueda.

Respecto al criterio, esto es muy flexible, y podemos hacer búsquedas globales (en cualquier parte del registro), en campos específicos (incluidos subcampos), o incluso combinaciones lógicas en las condiciones como OR y AND (para mas información del uso de las condiciones, referirse a la sección correspondiente al comando GREP )

Por el momento busquemos el texto “carpinteria”. Observemos que la busqueda no es case-sensitive

Búsqueda de texto específico

Vemos que en el archivo file9 hay 6 registros que contienen ese texto en el campo DE043. Vemos ademas los números de registro donde esta presente, y vemos también que los 6 registros corresponden a primeras presentaciones.

A partir de aquí podemos centrarnos en mejorar la búsqueda, pero ahora solamente sobre el archivo file9 que es el que contiene nuestra posible transacción buscada.

Por ejemplo, un siguiente paso podría ser que, ademas de mostrarnos los registros donde esta el texto que buscamos, nos muestre, ademas, el contenido de los campos DE004 (Importe de la transacción) y DE012 (Fecha y hora). Para ello podemos agregar el flag -F donde indicamos los campos que queremos mostrar de los registros encontrados, aunque ellos no contengan el valor buscado.

Para indicar los campos, escribimos la lista de campos separados por comas, y podemos indicar si se trata de un Data Element (DE), de un Private Data Subelement (PDS), o incluso si queremos especificar un Subfield de cualquiera de estos. Por ejemplo, la fecha y hora que vienen en el DE012, contiene dos subfields que son, la fecha en el subfield 1, y la hora en el subfield 2. Entonces, en lugar de especificar que queremos el DE12, podemos indicar que queremos el DE12 SF 1 y el DE12 SF 2 por separado.

Para mas información de como especificar los campos y también de como utilizar listas predefinidas, por favor referirse a la sección FILTER

Veamos la salida de este comando:

Resultados de búsqueda con CardAK

Ahora podemos ver los importes y los horarios en que esas transacciones fueron hechas.

Ahora bien, suponiendo que hay muchos registros que contienen el valor que estamos buscando, pero conocemos algún otro dato de la transacción, podemos ir mejorando el criterio de búsqueda. Por ejemplo, sabemos que la transacción fue hecha en el comercio llamado “carpinteria”, y que el valor de la misma fue de 1970.00

Podemos entonces, buscar ese registro especifico de la siguiente forma:

Resultados de búsqueda con CardAK

Ahora obtenemos como resultado un único registro, el 2339, que contiene la transacción que estamos buscando.

En este punto seguramente queramos ver todos los datos de la transacción en cuestión. Si bien podríamos especificar la lista de campos a desplegar, existen otras formas mas eficientes.

Para esto, podemos utilizar el comando PRINT. Este comando permite mostrar, en forma amigable, los contenidos de un archivo o de los registros especificados.

Podemos redirigir esa salida a un archivo de texto para poder visualizarla en un editor de texto.

Vamos a ver el contenido del registro encontrado con el comando GREP utilizado anteriormente. Vimos que el registro era el numero 2339, por lo que podemos indicar que queremos ver solamente ese registro

Contenido del registro encontrado

Por defecto, el comando PRINT nos muestra, para cada registro de salida, la lista de campos presentes en el registro (primero los DE y luego los PDS presentes).

Si queremos ver los valores de cada campo, agregaremos el flag --detailed (-d)

Vista detallada de campos

De esta forma veremos la lista de los campos presentes en el registro, su descripción, y el valor correspondiente.

Podemos agregar la opción --subfields (-s) para ver el contenido de cada uno de los subcampos de aquellos que tienen definidos dichos subcampos

Vista detallada de campos

En caso de querer redirigir esa salida a un archivo para ser visto en un editor de texto, es conveniente agregar los flags --silent (-z) o --mono para que la salida se haga sin los caracteres que indican los colores (salida monocromática).