You are on page 1of 82

CSV Robot

Software de procesamiento de archivos


CSV y Web Scraping
Manual v1.0
Programado por Marcos M. Correas
MMCSoft
marcos_correas@yahoo.com.ar

Rev. A Noviembre 2012


Crdoba - Argentina

Pagina 1

Manual CSV Robot v1.0 - Rev A

INDICE
1. Introduccin a CSV Robot
1.1 Que son los archivos CSV? .
1.2 Formato de los archivos CSV .
1.3 A quien est dirigido CSV Robot? ..

4
4
4
7

2. Como funciona CSV Robot? .


2.1 El archivo Script ...
2.2 Comentarios .
2.3 Parmetros ...
2.4 La seccin <CONFIG> ..
2.5 Ejemplos de secciones <CONFIG> ..
2.6 La seccin <PROCESOS> .
2.7 Segunda aproximacin al funcionamiento de CSV Robot ..
2.8 La lgica de ejecucin de CSV Robot ..

8
10
11
12
12
13
14
14
17

3. La interfaz grfica de CSV Robot . 19


4. Los procesos de CSV Robot ...
4.1 Proceso SETEAR_VALOR_COLUMNA .
4.1.1 Direccionamiento de variables ..
4.1.2 Ejemplo 1 Conversin de formatos CSV .
4.1.3 Ejemplo 2 Cambio de nombres de columnas ...
4.1.4 Ejemplo 3 Combinar dos archivos CSV en uno ...
4.2 Proceso EXTRAER_TEXTO_DESDE_TEXTO ...
4.2.1 Ejemplo 4 Extraccin de texto ...
4.2.2 Optimizacin del script ....
4.3 Proceso REEMPLAZAR_TEXTO_EN_TEXTO ..
4.3.1 Ejemplo 5 Reemplazo de texto ...
4.4 Proceso QUITAR_COLUMNA ...

21
22
23
25
26
28
30
32
33
35
35
38

5. Procesos orientados al Web Scraping ...


5.1 Que es el Web Scraping? ....
5.1 Proceso DESCARGAR_HTML ..
5.1.1 Ejemplo 6 Extraccin de informacin de una tienda online ...
5.1.2 Anlisis de la estructura de la pgina ....
5.1.3 El ejemplo paso a paso: El archivo de entrada Links.txt .
5.1.4 El ejemplo paso a paso: El archivo Script.txt .
5.2 Proceso CREAR_DIRECTORIO ....
5.2.1 Ejemplo 7 Creacin de directorios ..
5.3 Proceso CREAR_ARCHIVO ..
5.3.1 Ejemplo 8 Creacin de archivos ....

39
39
39
39
40
41
41
49
49
50
50

Pagina 2

Manual CSV Robot v1.0 - Rev A

5.4 Proceso DESCARGAR_ARCHIVO .... 55


5.4.1 Ejemplo 9 Descarga de archivos .... 55

6. Procesos Avanzados ...


6.1 Proceso EXTRAER_ARRAY_DESDE_TEXTO ......
6.1.1 Que es un ARRAY? .
6.1.2 Como se emplean los ARRAYS en CSV Robot? .
6.1.3 Volviendo a la extraccin .
6.1.4 Ejemplo 10 Extraer Array de links .
6.2 Proceso EXTRAER_ARRAY_DESDE_ARRAY ......
6.2.1 Ejemplo 11 Extraer Array desde Array .
6.3 Proceso DESCARGAR_ARCHIVOS_DESDE_ARRAY ...
6.3.1 Ejemplo 12 Descarga de array de archivos ..

60
60
62
62
63
65
70
71
76
76

7. Notas finales de este manual ......


7.1 Versin de demostracin de CSV Robot ......
7.2 Como adquirir la versin completa de CSV Robot? ......
7.3 Contacto con el programador y reporte de errores ....

82
82
82
82

Pagina 3

Manual CSV Robot v1.0 - Rev A

1. Introduccin a CSV Robot


Mi nombre es Marcos M. Correas (marcos_correas@yahoo.com.ar), de Crdoba,
Argentina, y soy el programador de CSV Robot.
CSV Robot es un software destinado a automatizar el trabajo con archivos CSV
(Valores separados por comas), que incluye funciones de Web Scrapping (recuperacin
de informacin de inters en forma automatizada desde pginas web).
1.1 Que son los archivos CSV?
El nombre deriva del formato interno del archivo CSV. Tiene su traduccin en Comma
Separated Values, o valores separados por comas. Es un formato de almacenamiento
de datos muy sencillo pero a la vez muy empleado para proporcionar datos de entrada u
obtener datos de salida desde software de todo tipo.
1.2 Formato de los archivos CSV
Los archivos CSV son tablas de datos. Los archivos CSV no incluyen ningn tipo de
informacin de formato como tipo de letra o color, solo almacenan una tabla, con
columnas y filas.
Por ejemplo, veamos como se puede emplear un archivo CSV para almacenar una lista
de contactos, por ejemplo:
Nombre
Luis Esteban
Raul Lopez
Maria Gomez

Edad
31
28
41

Telefono
555-234567
556-985634
433-095356

Si esta tabla de datos se guardara en formato CSV se podra guardar de la siguiente


manera:
Nombre,Edad,Telefono
Luis Esteban,31,555-234567
Raul Lopez,28,556-985634
Maria Gomez,41,433-095356
Por que se dice que se podra guardar de esa manera?
Simplemente porque la siguiente tambin es vlida
Nombre;Edad;Telefono
Luis Esteban;31;555-234567
Raul Lopez;28;556-985634
Maria Gomez;41;433-095356
En el primer ejemplo, los datos se separan empleando el delimitador , mientras que en
el segundo ejemplo, los mismos datos se separan empleando ;
El formato CSV no es un Standard, en ninguna parte hay una especificacin que indique
que delimitador se debe emplear, incluso aunque el nombre indique que son valores
separados por comas, se puede emplear cualquier smbolo para separar los valores. Se

Pagina 4

Manual CSV Robot v1.0 - Rev A

dice que un archivo posee formato CSV cuando cumple una serie de convenciones muy
flexibles, y que dependen en gran medida del software que lo emplee.
Como no hay un Standard que lo rige, es muy comn que un software (A) que exporte
datos en formato CSV emplee un carcter como delimitador, mientras que otro software
(B) que permita el ingreso de datos a travs de un archivo CSV requiera otro
delimitador distinto, lo que en principio no permitira que (B) aprovechara los datos
generados por (A) sin que los mismos pasen antes por un proceso de conversin.
Las reglas generales que la gran mayora de los archivos CSV emplean son:
1 - La primera lnea del archivo es la lnea que contiene los nombres de las columnas
de la tabla de datos
En el ejemplo, el archivo contiene 3 columnas, Nombre, Edad y Telefono
Nombre,Edad,Telefono
2 - Cada lnea siguiente del archivo CSV, representa un fila de la tabla.
Normalmente, la denominacin correcta es que cada lnea es un REGISTRO de
informacin, y cada registro esta formado por una serie de CAMPOS (las columnas)
En el ejemplo:
Luis Esteban,31,555-234567, Es el registro numero 1 y:
Raul Lopez,28,556-985634, Es el registro numero 2
3 - Los campos de cada registro y de los nombres de las columnas se encuentran
delimitados por un carcter definido por el software, que sirve de separador para
determinar, al momento de leer cada registro, que valor pertenece a cada campo
En el primer ejemplo de CSV:
Nombre,Edad,Telefono
Luis Esteban,31,555-234567
Raul Lopez,28,556-985634
Maria Gomez,41,433-095356
Se emplea un delimitador ,. Entonces, el software, al leer el archivo puede interpretar
el comienzo y final de cada campo sobre cada registro, as puede determinar que para el
registro nmero 2, El campo Nombre tiene valor Raul Lopez, y el campo Edad
tiene valor 28.
Volvemos a repetir, no existe un Standard que obligue a emplear un delimitador en
particular. En principio, el siguiente ejemplo
Nombre?Edad?Telefono
Luis Esteban?31?555-234567
Raul Lopez?28?556-985634
Maria Gomez?41?433-095356
Es totalmente vlido como archivo CSV, pero el software que intente recuperar la
informacin de este archivo debe conocer que se emplea el carcter ? como

Pagina 5

Manual CSV Robot v1.0 - Rev A

delimitador de los campos. A pesar que se puede emplear como delimitador cualquier
carcter, la mayora de los softwares emplean , o ; como delimitador
4 - Todos los registros del archivo deben contener el mismo nmero de campos, lo
siguiente no es vlido:
Nombre,Edad,Telefono
31,555-234567
Raul Lopez,28,556-985634,23
En el primer registro, el software detecta 2 campos en el registro, pero la lnea de las
columnas indica que hay 3 campos definidos, entonces el software no puede determinar
si falta el campo Nombre, o nombre es 31 y falta el campo telefono.
De igual forma, al registro 2 le sobra un valor 23, que el software no tiene definido
como campo en la lnea de columnas.
Normalmente, cuando falta un valor en un registro se escribe de la siguiente manera:
Nombre,Edad,Telefono
Luis Esteban,,31,555-234567 (1)
Raul Lopez,28, (2)
,41,433-095356 (3)
Al registro (1) le falta el campo Edad
Al registro (2) le falta el campo Telefono
Al registro (3) le falta el campo Nombre
5 - Puede ocurrir que algn campo, contenga en su interior, como parte de la
informacin til, el mismo carcter que se emplea como delimitador del archivo, por
ejemplo:
Nombre,Edad,Nota Matematicas,Nota Geografia
Luis Esteban,18,8,9,10
Raul Lopez,19,7,5,8,2
Maria Gomez,18,6,3,9
Como hacemos para que el software que lee este archivo CSV interprete para el registro
numero 1 que 8,9 es el valor del campo Nota Matematicas y no tome , como
delimitador, asignando 8 a Nota Matematicas, 9 a Nota Geografia, y reporte un
error porque sobra el valor 10?
Para ello, se emplea un segundo carcter definido como agrupador. La funcion de este
segundo carcter es agrupar aquellos campos que contienen el carcter delimitador en su
interior. Normalmente este carcter son las comillas dobles.
Entonces, para denotar que 8,9 es una entidad nica y que no se debe interpretar como 8
y 9, se encierra entre comillas dobles. Entonces, el archivo CSV sera:
Luis Esteban,18,8,9,10
Raul Lopez,19,7,5,8,2
Maria Gomez,18,6,3,9

Pagina 6

Manual CSV Robot v1.0 - Rev A

6 - Como ocurre con el delimitador, puede ocurrir tambin que algn campo, contenga
en su interior, como parte de la informacin til, el mismo carcter que se emplea como
agrupador del archivo, por ejemplo, un archivo con informacin de libros:
Codigo,Nombre,Ubicacion
AB001,El rey Arturo, y los caballeros de la mesa redonda,Seccion A
AB002,Programacin en C, para torpes,Seccion B
Para estos casos, la solucin empleada depende en gran medida del software que
manipule los archivos. Algunos simplemente no permiten que los campos incluyan el
carcter agrupador, otros, emplean algn tipo de convencin para identificar estos casos,
entre las convenciones ms empleadas, por ejemplo:
1 - Si el valor incluye las comillas dobles, anteponer otro carcter de comillas dobles
(), es decir, Programacin en C, para torpes, se convierte en Programacin en C,
para torpes
2 - Si el valor incluye las comillas dobles, anteponer el carcter barra invertida (\), es
decir, Programacin en C, para torpes, se convierte en Programacin en C, para
\torpes\. CSV Robot emplea esta convencin.
Se puede concluir que un archivo CSV es un formato muy sencillo, que representa
simplemente una tabla de datos, que puede ser la entrada de datos a un software, o la
salida de datos procesados por un software.
El formato CSV es fcilmente interpretable por un ser humano, y a la vez, muy fcil de
procesar por un software, pero en la prctica, la sencillez y la falta de un Standard
provocan que cada software defina reglas propias, que impiden el intercambio de datos
entre distintos softwares.
Solucionar este tipo de problemas, y facilitar la interoperatividad entre sistemas es uno
de los objetivos de CSV Robot
1.3 A quien est dirigido CSV Robot?
Este software est dirigido tanto a aquellos usuarios de algn sistema de software que
requiera el ingreso de datos en formato CSV, como a aquellos que obtengan datos desde
un software en formato CSV, y necesiten realizar algn procesamiento sobre los
archivos. Si bien el formato es muy sencillo de manipular, no hay opciones de software
que permitan realizar tareas repetitivas sobre archivos CSV grandes de una manera
sencilla.
Este software esta principalmente orientado a los propietarios de tiendas online. Las
tiendas online proveen funciones de importacin (carga) masiva de productos y
generalmente requieren que los datos se carguen en forma de archivos de texto CSV.
El formato CSV es muy sencillo de manipular con un simple editor de texto. El
problema real surge cuando es necesario hacer una modificacin o procesamiento
repetitivo sobre un campo de un archivo que contiene cientos o miles de registros.

Pagina 7

Manual CSV Robot v1.0 - Rev A

2. Como funciona CSV Robot?


CSV Robot tiene un funcionamiento muy sencillo. Toma como entrada de datos 2
archivos en formato CSV que lo alimentan de los datos de entrada. Dichos archivos Se
denominan ENTRADA_1 y ENTRADA_2. El archivo ENTRADA_1 es obligatorio
para trabajar, pero el archivo ENTRADA_2 es opcional. Mas adelante se ver porque la
opcin de 2 archivos de entrada.
CSV Robot toma un tercer archivo, llamado archivo de SCRIPT. Script significa
Guin en ingles, y es un trmino muy comn para denotar pequeos programas que
realizan tareas muy especficas.
En el caso de CSV Robot, el archivo de Script es el que contiene una lista de
operaciones o PROCESOS, que se aplicarn sobre cada uno de los datos de entrada y
generaran datos de salida. Dichos datos de salida se almacenan en el archivo SALIDA,
y son la informacin til o el resultado del trabajo de CSV Robot.
En la siguiente imagen se puede observar un diagrama de los elementos con los que
trabaja CSV ROBOT.

ENTRADA_1: Archivo de texto en formato CSV


ENTRADA_2: Archivo de texto en formato CSV (opcional)
SCRIPT: Archivo de texto que contiene el Guin o procesos a ejecutar sobre los
datos provenientes de los archivos ENTRADA_1 y ENTRADA_2.
SALIDA: Es el archivo, en formato CSV resultante de la transformacin de los datos de
los archivos ENTRADA_1 y ENTRADA_2 segn las ordenes contenidas en el
SCRIPT.
De esta explicacin se puede deducir porque el software se llama CSV Robot. El
software es un robot, que se encarga de ejecutar las ordenes contenidas en el archivo
SCRIPT, y dichas ordenes le indican las operaciones que debe ejecutar sobre los datos
de los archivos de entrada para generar un archivo de salida.

Pagina 8

Manual CSV Robot v1.0 - Rev A

Comencemos con un ejemplo prctico, para entender mejor que puede hacer CSV
Robot
Ejemplo:
Disponemos de un archivo de datos CSV que representa una lista de productos, dicha
lista se ha obtenido de una planilla de Excel o de un software de gestin, y contiene los
siguientes datos:
SKU;NOMBRE;PRECIO;DESCRIPCION
A001;Producto1;$10,00;Descripcion1
A002;Producto2;$15,00;Descripcion2
A003;Producto3;$12,50;Descripcion3
..
Como se observa, el archivo emplea como separador de los valores el punto y coma,
posee 3 registros (filas de datos), y cada registro posee 4 campos (columnas):
- Sku, es el identificador de producto, un cdigo nico que lo identifica y diferencia del
resto de los productos de la lista.
- Nombre, es el nombre del producto
- Precio es el precio del producto, posee signo de moneda ($) y emplea la coma como
separador de enteros y decimales (ejemplo: $10,00)
- Descripcin, es la descripcin del producto.
Es muy normal que el software del cual hemos obtenido la lista de productos, y que
puede ser el software de gestin de nuestro negocio, posea ciertas convenciones propias
en cuanto a la representacin de la informacin, y que dichas convenciones no se
puedan modificar, como por ejemplo, el empleo de la coma como separador de enteros
y decimales en el precio, o el empleo del signo de moneda. Obsrvese tambin que es
muy comn en muchos softwares, exportar o importar archivos CSV que emplean el
carcter punto y coma como separador de los datos, y no la coma.
Estas convenciones, son las que provocan problemas a la hora de intentar cargar dicha
informacin en un software distinto como ser una tienda online. Puede ser que la tienda
online requiera que los precios empleen el punto como separador de enteros y
decimales, que no incluyan el signo de moneda, y que la separacin de los valores de
cada registro sea con el carcter coma, por ejemplo.
Esta adecuacin del archivo CSV obtenido de un software (nuestro software de
gestin y facturacin) para cargarlo en otro software distinto (nuestra tienda online)
puede ser muy sencilla si contiene una lista pequea de productos, pero lo normal es
que la lista contenga muchos registros. Se imagina convertir manualmente este archivo
(A) generado por su software de gestin:
SKU;NOMBRE;PRECIO;DESCRIPCION
A001;Producto1;$10,00;Descripcion1
A002;Producto2;$15,00;Descripcion2
A003;Producto3;$12,50;Descripcion3
..
En este archivo (B) requerido por su tienda online?:
SKU,NOMBRE,PRECIO,DESCRIPCION
A001,Producto1,10.00,Descripcion1

Pagina 9

Manual CSV Robot v1.0 - Rev A

A002,Producto2,15.00,Descripcion2
A003,Producto3,12.50,Descripcion3
..
Puede ser muy sencillo si la lista contiene 10, 20 o hasta 50 productos, pero si la lista
contiene 2000 productos? Y si es necesario actualizar los precios, agregar o quitar
productos con cierta frecuencia?, digamos diariamente?
All es donde radica la potencia de CSV Robot. CSV Robot puede convertir el archivo
(A) en el archivo (B) en forma totalmente automatizada, si se escribe adecuadamente la
Secuencia de tareas a realizar en el archivo de Script, y lo mas importante, es que el
archivo de script se puede guardar para emplearlo todas las veces que quiera sobre
distintos datos de entrada, por lo que la actualizacin de datos es muy sencilla.
2.1 El archivo Script
Vamos a hablar sobre el formato del archivo script empleado por CSV Robot, para
luego comenzar a adentrarnos en las funciones disponibles
El archivo de script es un archivo de texto que puede contener extensin txt o cualquier
otra que se desee. Es recomendable emplear extensin txt para crear y modificar el
archivo script con cualquier editor de texto.
El archivo de script tiene una estructura de archivo XML simplificada. Internamente
deben respetarse ciertas reglas de escritura para que el script pueda ser interpretado
correctamente por CSV Robot. La estructura general o esqueleto de un archivo Script
ejecutable por CSV Robot es la siguiente:
<ROOT>
<CONFIG>
..
..
</CONFIG>
<PROCESOS>
..
..
</PROCESOS>
</ROOT>
El archivo posee elementos llamados secciones. Cada seccin esta delimitada por las
etiquetas <NOMBRE_SECCION> y </NOMBRE_SECCION > y una seccin contiene
en su interior a otras secciones y/o parmetros.
Es obligatorio que el archivo de script respete esta estructura: una seccin principal
ROOT, o raz del script, que contiene en su interior dos secciones, CONFIG y
PROCESOS. En la seccin CONFIG se encuentran todos los parmetros de
configuracin que emplea CSV robot, como los archivos de entrada, formato de los
mismos, etc., y en la seccin PROCESOS, se encuentran justamente los procesos o
tareas a ejecutar.
Es necesario aclarar que CSV Robot ignora los espacios en blanco y tabulaciones antes
y despus del texto, por lo que es lo mismo escribir

Pagina 10

Manual CSV Robot v1.0 - Rev A

<ROOT>
<CONFIG>
..
</CONFIG>
<PROCESOS>
.
</PROCESOS>
</ROOT>
Pero se recomienda el empleo de tabulaciones ya que para un ser humano es mucho ms
fcil de leer el primer ejemplo.
CSV Robot interpreta los finales de lnea presentes en el archivo, por lo que escribir de
la forma
.
<CONFIG> .</CONFIG>

Es incorrecto. Es necesario que cada etiqueta <SECCION> o </SECCION> se


encuentre en una lnea independiente.
2.2 Comentarios
Se pueden intercalar comentarios en cualquier parte del script. Los comentarios son
ignorados por CSV Robot y tienen la nica funcin de servir al usuario para documentar
el script internamente como ayuda a memoria o para agregar toda la informacin que
considere necesaria.
Los comentarios:
1 Comienzan con ;
2 Ocupan una lnea propia en el archivo
Estos son comentarios correctos e incorrectos:
<ROOT>
; Este es un comentario correcto
<CONFIG>
..
; Este es un comentario correcto
</CONFIG>
; Este es un comentario correcto
; Este es un comentario correcto
<PROCESOS>
.. ; Este es un comentario incorrecto
</PROCESOS>
; Este es un comentario incorrecto
</ROOT>

Pagina 11

Manual CSV Robot v1.0 - Rev A

2.3 Parmetros
Como se coment previamente, el archivo Script esta organizado en Secciones. Cada
seccin puede contener otras secciones y/o parmetros.
Las secciones sirven para ordenar y dar estructura al script, mientras que los parmetros
son informacin que CSV Robot emplea para trabajar
Los parmetros tienen la forma:
Parmetro = Valor
Valor, se encierra entre comillas. CSV Robot ignora los espacios en blanco, por lo que
es indistinto colocar o no espacios entre parmetro, valor y el signo =.
Los parmetros, tienen nombre y significado, algunos son obligatorios y otros son
opcionales. Los parmetros dentro de la seccin <CONFIG> determinan opciones de
funcionamiento de CSV Robot, como los nombres de los archivos de datos de entrada
ENTRADA_1 y ENTRADA_2 y el nombre del archivo resultado SALIDA.
Los parmetros dentro de la seccin <PROCESOS> configuran cada una de las
opciones de los procesos a aplicar a fin de obtener los resultados deseados.
2.4 La seccin <CONFIG>
Toda la configuracin principal del funcionamiento de CSV Robot se encuentra dentro
de la seccin <CONFIG> del archivo script. Los parmetros que se encuentran dentro
de <CONFIG> son los siguientes:
ARCHIVO_ENTRADA_1: Obligatorio - Indica el nombre del archivo en formato CSV
que ser empleado como entrada de datos numero 1 a CSV Robot.
ARCHIVO_ENTRADA_2: Opcional - Indica el nombre del archivo en formato CSV
que ser empleado como entrada de datos numero 2 a CSV Robot.
ARCHIVO_SALIDA: Obligatorio - Indica el nombre del archivo en formato CSV en el
cual se almacenaran los datos procesados por CSV Robot.
DELIMITADOR_ENTRADA_1: Opcional Indica cual es el carcter delimitador
empleado en ARCHIVO_ENTRADA_1. El valor de este parmetro puede ser , o ;.
Si este parmetro no esta presente, se asume que ARCHIVO_ENTRADA_1 emplea el
carcter , como delimitador de los datos.
DELIMITADOR_ENTRADA_2: Opcional Indica cual es el carcter delimitador
empleado en ARCHIVO_ENTRADA_2. El valor de este parmetro puede ser , o ;.
Si este parmetro no esta presente, se asume que ARCHIVO_ENTRADA_2 emplea el
carcter , como delimitador de los datos.
DELIMITADOR_SALIDA: Opcional Indica cual es el carcter delimitador empleado
en ARCHIVO_ SALIDA. El valor de este parmetro puede ser , o ;. Si este
parmetro no esta presente, se asume que ARCHIVO_ SALIDA emplea el carcter ,
como delimitador de los datos.
Nota sobre los nombres de archivo: CSV Robot trabaja con carpetas relativas a la
carpeta en la que se encuentra el script. Por lo tanto, los nombres de archivo que se
especifican sin ruta, se buscan en la misma carpeta que el script.

Pagina 12

Manual CSV Robot v1.0 - Rev A

2.5 Ejemplos de secciones <CONFIG>


Ejemplo 1 - CSV Robot toma los datos de entrada 1 desde el archivo A.txt ubicado
en la misma carpeta del script. No se emplea el archivo de entrada 2, y se especifica
S.txt como nombre del archivo de salida. Para ambos archivos, se emplea el carcter
, como separador de los datos.
<CONFIG>
ARCHIVO_ENTRADA_1 = A.txt
ARCHIVO_SALIDA = S.txt
</CONFIG>
Ejemplo 2 - Los datos de entrada 1 se obtienen de Entrada1.txt, y los datos de salida
se almacenan en Salida.txt, pero ahora, los datos se obtienen de un archivo con
delimitador , y se desean almacenar con delimitador ;
<CONFIG>
ARCHIVO_ENTRADA_1 = Entrada1.txt
(1)
DELIMITADOR_ENTRADA_1 = ,
ARCHIVO_SALIDA = Salida.txt
DELIMITADOR_SALIDA = ;
</CONFIG>
La lnea (1) no es necesaria, ya que si se omite el parmetro DELIMITADOR para
cualquiera de los archivos, se asume por defecto el carcter ,
Ejemplo 3 - Los datos de entrada 1 se obtienen de Entrada1.txt, los datos de entrada 2
desde Entrada2.txt y los datos de salida se almacenan en Salida.txt, Se emplea el
carcter ; como delimitador para todos los archivos, pero la particularidad, es que
Entrada1.txt y Entrada2.txt se encuentran en la carpeta Datos dentro de la carpeta en
la que se encuentra el script, y el archivo Salida.txt se crear en la misma carpeta del
script
<CONFIG>
ARCHIVO_ENTRADA_1 = Datos\Entrada1.txt
DELIMITADOR_ENTRADA_1 = ;
ARCHIVO_ENTRADA_2 = Datos\Entrada2.txt
DELIMITADOR_ENTRADA_2 = ;
ARCHIVO_SALIDA = Salida.txt
DELIMITADOR_SALIDA = ;
</CONFIG>
Ejemplo 4 - Igual al ejemplo 3, pero ahora los datos se encuentran en otra unidad de
disco.
Esta configuracin no se puede realizar. Como se comento previamente, CSV Robot
emplea rutas relativas al archivo de script, por lo tanto, solo puede acceder a archivos

Pagina 13

Manual CSV Robot v1.0 - Rev A

contenidos dentro de la misma carpeta del archivo scripts o en subcarpetas. Si el archivo


script se encuentra en C:\CSVRobot\Ejemplo1\, entonces todos los archivos con los
que trabaje CSV Robot se debern encontrar en C:\CSVRobot\Ejemplo1\ o en
subcarpetas.
2.6 La seccin <PROCESOS>
Hablemos brevemente de los procesos. Los procesos son las tareas que realiza CSV
Robot. El software dispone de una serie de tareas predefinidas que es capaz de realizar.
Cada tarea dispone de algunos parmetros obligatorios y otros opcionales, que permiten
configurar el comportamiento de la tarea. Cada tarea o proceso, como lo llamaremos de
ahora en ms, se define de la forma:
<PROCESOS>

..
<NOMBRE_PROCESO>
; comentario (opcional)
Parametro1 = Valor1
Parametro1 = Valor1
ParametroN = ValorN
; comentario (opcional)
</ NOMBRE_PROCESO>
..
.
</PROCESOS>
Como se comento previamente, todos los procesos se ubican dentro de la seccin
PROCESOS, y cada proceso es en si mismo una sub seccin encerrada entre etiquetas
<NOMBRE_PROCESO> y </NOMBRE_PROCESO>. Ms adelante se vern con
ejemplos prcticos cada uno de los procesos y su funcionamiento.
Cada proceso requiere de ciertos parmetros para funcionar o realizar su tarea
correctamente. Dichos parmetros se definen de la misma forma que se trato
anteriormente para la seccin <CONFIG>, pero dentro de la seccin que conforma el
proceso en si. Dependiendo el proceso que se trate, requerir algunos parmetros en
forma obligatoria y otros en forma opcional.
2.7 Segunda aproximacin al funcionamiento de CSV Robot
Estamos en condiciones de ver el funcionamiento de CSV Robot en ms detalle.
Supongamos que disponemos del siguiente archivo A.txt con formato CSV:
Nombre Producto,Sku,Precio
Producto1;TP01;$10.00
Producto2;TP02;$12.00
Y deseamos convertirlo en el archivo Salida.txt de la forma:
Product Name,Sku,Price,Manufacturer

Pagina 14

Manual CSV Robot v1.0 - Rev A

Producto1,TP01,10,00,ACME
Producto2,TP02,12,00,ACME
(Ntese que la columna Price posee los valores encerrados entre comillas dobles,
porque adems de eliminarse el signo de moneda $, se ha cambiado el signo de
decimales por la coma , y como la coma se emplea como delimitador de los valores
del archivo, es necesario agrupar con comillas dobles para evitar que se interpreten las
comas internas como delimitadores)
Establezcamos ciertas convenciones y definiciones para comprender mejor el
funcionamiento de CSV Robot:
1 - Cada lnea del archivo de entrada se denomina registro de entrada. La primera
lnea es el registro 1, la segunda el registro 2, etc. En el caso del ejemplo, el primer
registro del archivo A.txt es:
Producto1;TP01;$10.00
CSV Robot denomina al registro que proviene del archivo de entrada de datos numero 1
como ENTRADA_1, y al que contiene datos del archivo de datos numero 2 (opcional),
ENTRADA_2.
2 - Cada lnea del archivo de salida se denomina registro de salida. La primera lnea
es el registro 1, la segunda el registro 2, etc. En el caso del ejemplo, el primer registro
del archivo Salida.txt es:
Producto1,TP01,10,00,ACME
CSV Robot denomina al registro del archivo de salida SALIDA.
3 - Cada Registro de Entrada, luego de aplicarse las operaciones o procesos indicados
en el script se transforma en un registro de salida, es decir, hay una correspondencia 1 a
1 entre el archivo de entrada y el archivo de salida. Cada registro de entrada, luego de
aplicar las operaciones o procesos, genera como resultado un nico registro de salida. Si
el archivo de entrada contiene 100 registros, el de salida contendr 100 registros, ni uno
mas, ni uno menos.
4 - No es necesario que el registro de salida contenga la misma cantidad de columnas
o campos que el registro de salida. En el ejemplo, el registro de entrada posee 3
campos (Nombre Producto,Sku,Precio), y el registro de salida posee 4 campos (Product
Name,Sku,Price,Manufacturer) Tambin se observa que no es necesario que los campos
del registro de salida tengan el mismo nombre ni el mismo orden que los campos del
registro de entrada.
Volviendo al ejemplo, si pudisemos dar instrucciones a CSV Robot en lenguaje
humano escribiramos un script semejante a esto:
Opciones de configuracin:
1 - El archivo de entrada se llama: A.txt
2 - El archivo de entrada emplea ; como separador
3 - El archivo de salida se llama Salida.txt
4 - Quiero emplear el carcter , como separador del archivo de salida
Sobre cada Registro (lnea) del archivo de entrada quiero que realices las siguientes
operaciones (Procesos):
1 - Toma un registro o lnea del archivo de entrada.

Pagina 15

Manual CSV Robot v1.0 - Rev A

2 Crea un registro de salida vaci.


3 En el registro de salida, crea una nueva columna llamada Product Name, y dentro
de esa columna quiero que copies el contenido de la columna NombreProducto del
registro de entrada.
4 En el registro de salida, crea una nueva columna llamada Sku, y dentro de esa
columna copia el contenido de la columna Sku del registro de entrada.
5 En el registro de salida, crea una nueva columna llamada Price, y dentro de esa
columna quiero que copies el contenido de la columna Precio del registro de entrada,
pero eliminando el signo $ y reemplazando el signo . De decimales por el signo ,.
6 En el registro de salida, crea una nueva columna llamada Manufacturer, con un
valor constante ACME.
7 - Guarda el registro de salida en el archivo de salida
Si el robot pudiera entender el lenguaje humano, repitiendo los procesos 1 a 7 sobre
todos los registros del archivo de entrada A.txt, generara el archivo de salida deseado
Salida.txt
Lamentablemente CSV Robot no entiende el lenguaje humano. CSV Robot interpreta
un conjunto reducido de ordenes o procesos, y nosotros como programadores debemos
conocer ese abanico de procesos disponibles, y acomodarlos para obtener el resultado
deseado de acuerdo a nuestra necesidad.
Aun no nos adentraremos en la forma estricta de escribir los procesos, Eso lo iremos
viendo paso por paso. Por ahora, haremos una reescritura del script a un formato no tan
relajado como el lenguaje humano, y tomando lo visto previamente sobre los
parmetros de configuracin y la seccin <CONFIG>, nos acercaremos un poco mas a
los requerimientos de CSV Robot para el archivo script (aun estamos empleando una
sintaxis ligera, hasta que conozcamos realmente los procesos disponibles):
<ROOT>
<CONFIG>
ARCHIVO_ENTRADA_1 = A.txt
DELIMITADOR_ENTRADA_1 = ;
ARCHIVO_SALIDA = Salida.txt
DELIMITADOR_SALIDA = ,
</CONFIG>
<PROCESOS>
; Paso 1
<LEE REGISTRO ENTRADA>
Lee un registro del archivo de entrada 1, a ese registro se le
llamar ENTRADA_1
</LEE REGISTRO ENTRADA>
; Paso 2
<CREA REGISTRO SALIDA >
Crea registro de salida vaco, sin columnas ni datos.
A ese registro se le llamar SALIDA
</ CREA REGISTRO SALIDA >
; Paso 3
<COPIA COLUMNA>
Origen = Nombre Producto, en registro ENTRADA
Destino = Product Name, en registro SALIDA
</COPIA COLUMNA>

Pagina 16

Manual CSV Robot v1.0 - Rev A

; Paso 4
<COPIA COLUMNA>
Origen = Sku, en registro ENTRADA
Destino = Sku, en registro SALIDA
</COPIA COLUMNA>
; Paso 5 (A)
<COPIA COLUMNA>
Origen = Precio, en registro ENTRADA
Destino = Price, en registro SALIDA
</COPIA COLUMNA>
; Paso 5 (B)
<ELIMINA TEXTO>
Origen = Price, en registro SALIDA
Destino = Price, en registro SALIDA
Texto a eliminar = $
</ELIMINA TEXTO>
; Paso 5 (C)
<REEMPLAZA TEXTO>
Origen = Price, en registro SALIDA
Destino = Price, en registro SALIDA
Texto a eliminar = $
</ REEMPLAZA TEXTO>
; Paso6
<AGREGA COLUMNA>
Nombre = Manufacturer, en registro SALIDA
Valor = ACME
</AGREGA COLUMNA>
; Paso 7
<GUARDA REGISTRO SALIDA>
Guarda el registro de salida empleando el delimitador
DELIMITADOR_SALIDA
</ GUARDA REGISTRO SALIDA >
</PROCESOS>
</ROOT>
Hay que notar que el paso 5 se ha dividido en 3 operaciones, la primera es de copia,
copia el contenido de la columna Precio del registro de entrada a la columna Price
del registro de salida, la segunda operacin, elimina el smbolo $ del contenido de la
columna Price y guarda el resultado de la operacin en la misma columna Price.
Finalmente, la tercera operacin, reemplaza el smbolo . Empleado como separador
decimal, por el smbolo ,.
Este tipo de operaciones, en donde se opera sobre una columna y el resultado se guarda
en la misma son muy comunes.
2.8 La lgica de ejecucin de CSV Robot
Del ejemplo anterior, hay que aclarar que los pasos 1,2 y 7 son realizado
automticamente por CSV Robot, es decir, CSV Robot comienza por analizar el script,
verificar que se encuentren las secciones requeridas (<CONFIG> y <PROCESOS>),
que se encuentren los parmetros de configuracin obligatorios (Archivo de entrada 1 y

Pagina 17

Manual CSV Robot v1.0 - Rev A

archivo de salida), y luego verifica que en la seccin <PROCESOS> se encuentre la


lista de procesos a ejecutar. A continuacin, inicia un ciclo que se repite TANTAS
VECES COMO REGISTROS CONTENGA ARCHIVO_ENTRADA_1. Esto es
muy importante, la cantidad de registros del archivo de salida esta fijada por la cantidad
de registros del archivo ENTRADA_1.
En cada ciclo de ejecucin, CSV Robot realiza las siguientes tareas:
1 - Toma un registro de ARCHIVO_ENTRADA_1, y lo denomina ENTRADA_1
2 - Opcionalmente, toma un registro de ARCHIVO_ENTRADA_2, y lo denomina
ENTRADA_2
3 Crea un registro de salida vaco, sin columnas, y lo denomina SALIDA
4 - Aplica todos los procesos escritos en la seccin <PROCESOS> del archivo script
sobre los registros obtenidos
5 - Se obtiene un registro resultante de salida, que se escribe en el archivo
ARCHIVO_SALIDA.
6 - Repetir el ciclo desde (1) hasta que se acaben los registros del archivo de entrada 1

Pagina 18

Manual CSV Robot v1.0 - Rev A

3. La interfaz grfica de CSV Robot


CSV Robot es un software para entornos Windows. La interfaz grfica es muy sencilla,
ya que esta orientado a automatizar procesos con la mnima intervencin del usuario:

1 Botn Abrir Script: Al hacer clic en este botn, se presentar un cuadro de dilogo
que permitir seleccionar el archivo script a cargar:

Recordar que el archivo script puede tener cualquier extensin y nombre, mientras sea
un archivo de texto y cumpla con el formato requerido por CSV Robot. Se recomienda
emplear el nombre Script.txt (El nombre para recordar de que se trata, y txt para
poder editarlo con cualquier editor simple de texto).

Pagina 19

Manual CSV Robot v1.0 - Rev A

2 Botn Ejecutar Script: Si se carga correctamente el script seleccionado, y no se


detectan errores de formato del mismo, se habilita este botn, que permite ejecutar el
script. Cuando comienza la ejecucin del script, este botn cambia a Detener Script, y
permite que el usuario termine la ejecucin del script en cualquier momento.

3 Informacin del script: Aqu se presenta la informacin del script abierto, nombre
del archivo script, y los nombres de los archivos de entrada 1 y 2, y de salida
(parmetros recuperados del archivo script)

4 Informacin de proceso: Aqu se muestra el proceso actual que se esta aplicando


sobre el registro actual. Muestra el numero total de procesos a aplicar, y el nombre de
cada proceso que se aplica. Cuando la barra de estado se llena totalmente, se termina de
procesar un registro del archivo de entrada.

Pagina 20

Manual CSV Robot v1.0 - Rev A

5 Informacin del registro: Aqu se muestra que registro se esta procesando


actualmente y cuantos son los registros a procesar. Cuando la barra se llena totalmente,
se termina el script.

6 Reporte de errores. Si ocurre algn error al ejecutar el script, se despliega un cuadro


de dialogo indicando que ha ocurrido un error, y aqu se informa en que registro y en
que proceso ocurri el mismo.

Como hay errores que solo se pueden detectar cuando se ejecuta el script, esta
informacin es muy til para encontrar errores en los scripts.

Pagina 21

Manual CSV Robot v1.0 - Rev A

4. Los procesos de CSV Robot


Es hora de comenzar a ver los procesos que puede realizar CSV Robot sobre los datos.
Se vern los procesos uno a uno con ejemplos. Los archivos y scripts de ejemplo se
pueden encontrar en la carpeta Ejemplos, dentro de la carpeta del ejecutable de CSV
Robot
4.1 Proceso SETEAR_VALOR_COLUMNA
Este es uno de los procesos mas sencillos y mas empleados. La operacin consiste en
fijar el valor de una columna del REGISTRO DE SALIDA.
Los parmetros requeridos por este proceso son:
COLUMNA = CCC, indica el nombre de la columna del registro SALIDA sobre la
cual se fijar el valor
VALOR = VVV, indica el valor a escribir en la columna.
Ejemplo:
<SETEAR_VALOR_COLUMNA>
COLUMNA = Proveedor
VALOR = ACME
</SETEAR_VALOR_COLUMNA>
Hay que notar los siguientes puntos:
1 - Si la columna CCC, o en el caso del ejemplo, la columna Proveedor, no existe
en el registro de SALIDA, se crea automticamente antes de setear su valor.
2 - Durante el procesamiento, en cada ciclo de trabajo, el registro de SALIDA se inicia
en blanco, sin NINGUNA columna. No se copia automticamente ninguna columna de
ninguno de los registros de entrada al registro de salida.
Por lo tanto, si se escribe un script de la forma:
<ROOT>
<CONFIG>

</CONFIG>
<PROCESOS>
</PROCESOS>
</ROOT>
Sin ningn proceso a ejecutar, se obtendr un archivo de salida vaco, sin registros ni
columnas, ya que NINGUNA COLUMNA de los registros de entrada se copia
automticamente al registro de salida.
Volviendo al proceso que estamos conociendo, si escribimos un script (a partir de este
punto se omiten las etiquetas ROOT y la seccin CONFIG para clarificar el texto) de la
forma:
..
<PROCESOS>
<SETEAR_VALOR_COLUMNA>

Pagina 22

Manual CSV Robot v1.0 - Rev A

COLUMNA = Proveedor
VALOR = ACME
</SETEAR_VALOR_COLUMNA>
</PROCESOS>

Si inicialmente la columna Proveedor no exista en el registro de salida, se crea


automticamente y luego se le fija el valor a ACME. Si el archivo
ARCHIVO_ENTRADA_1 posee 3 registros, luego de procesar este script se obtendr
un ARCHIVO_SALIDA con el siguiente contenido:
Proveedor
ACME
ACME
ACME
Ntese nuevamente que SIN IMPORTAR el contenido de los archivos de entrada, el
archivo de salida tendr la forma mostrada, ya que NO SE COPIA en forma automtica
ninguna columna de ninguno de los registros de entrada.
Esto no es muy til, cierto?.
La utilidad de este y todos los procesos se potencia cuando tratemos el tema
Direccionamiento de variables. Haremos una pequea pausa en el estudio de los
procesos para ver el tema de direccionamiento de variables
4.1.1 Direccionamiento de variables
El direccionamiento de variables nos permite tomar el valor de un campo de un registro
y emplearlo en cualquier parmetro de cualquier proceso.
Vamos por partes:
Si el archivo de entrada ARCHIVO_ENTRADA_1 tiene la forma:
SKU,NOMBRE,PRECIO
A001,Producto1,10.00
A002,Producto2,15.00
A003,Producto3,12.00
El archivo de entrada ARCHIVO_ENTRADA_2 tiene la forma
DESCRIPCION
Descripcion 1
Descripcion 2
Descripcion 3
Y el nico proceso a ejecutar tiene la forma
<PROCESOS>
<SETEAR_VALOR_COLUMNA>
COLUMNA = Name
VALOR = Producto1

Pagina 23

Manual CSV Robot v1.0 - Rev A

</SETEAR_VALOR_COLUMNA>
</PROCESOS>
Se obtendr un archivo ARCHIVO_SALIDA de la forma
Name
Producto1
Producto1
Producto1
Esto ocurre as porque el valor Producto 1 que se setea en la columna Name es una
constante, y no cambia su valor en cada ciclo de trabajo sobre los registros.
Si ahora en cambio, escribimos el proceso de la siguiente forma:
<PROCESOS>
<SETEAR_VALOR_COLUMNA>
COLUMNA = Name
VALOR = <% ENTRADA_1:NOMBRE %>
</SETEAR_VALOR_COLUMNA>
</PROCESOS>
Se obtendr un archivo ARCHIVO_SALIDA de la forma
Name
Producto1
Producto2
Producto3
Que ha pasado?
Se ha empleado la caracterstica de Direccionamiento de variables. El direccionamiento
de variables tiene la forma <% REGISTRO:COLUMNA %> y lo que provoca es que
antes de ejecutarse el proceso, se reemplazan los valores contenidos entre <% y %> por
los valores diseccionados. En este caso, se reemplaza <% ENTRADA_1:NOMBRE %>
por el valor contenido en la columna NOMBRE del registro ENTRADA_1.
Recordar que en cada ciclo de ejecucin, se toma un nuevo registro ENTRADA_1
desde el archivo ARCHIVO_ENTRADA_1, un nuevo registro ENTRADA_2 desde el
archivo ARCHIVO_ENTRADA_2 y se genera un nuevo registro de salida vaco, por lo
tanto, en el primer ciclo de ejecucin <% ENTRADA_1:NOMBRE %> se reemplaza
por Producto1, en el segundo ciclo por Producto2 y en el tercer ciclo por
Producto3.
En el direccionamiento de variables, REGISTRO puede ser ENTRADA_1,
ENTRADA_2 o SALIDA. Y COLUMNA, debe existir previamente, de lo contrario, se
interrumpe el script y reporta error.
Con estos conceptos, vamos a emplear el proceso SETEAR_VALOR_COLUMNA, en
conjunto con el direccionamiento de variables para algunos ejemplos prcticos
Los ejemplos que se presentan a continuacin trabajan con los siguientes archivos de
datos:
Entrada1.txt:

Pagina 24

Manual CSV Robot v1.0 - Rev A

Nombre;Sku;Precio
Producto1;TP01;$10.00
Producto2;TP02;$12.00
Producto3;TP03;$13.00
Entrada2.txt
Descripcion,Oferta
Descripcion1,Si
Descripcion2,No
Descripcion3,No
4.1.2 Ejemplo 1 Conversin de formatos CSV
Este ejemplo de puede encontrar en Ejemplos\Ejemplo1\Script.txt
Este ejemplo simplemente genera un archivo Salida.txt que contiene la misma
informacin que Entrada1, solo que Entrada1.txt posee como delimitador de campos el
carcter ; y Salida emplea el delimitador ,
Script:
<ROOT>
; Parametros de Configuracion
; --------------------------------------------------------------<CONFIG>
(1)
ARCHIVO_ENTRADA_1 = "Entrada1.txt"
(2)
DELIMITADOR_ENTRADA_1 = ";"
(3)
(4)
ARCHIVO_SALIDA = "Salida.txt"
</CONFIG>
; LISTA DE PROCESOS
; --------------------------------------------------------------<PROCESOS>
(5)
<SETEAR_VALOR_COLUMNA>
COLUMNA = "Nombre"
VALOR = "<% ENTRADA_1:Nombre %>"
</SETEAR_VALOR_COLUMNA>
(6)

<SETEAR_VALOR_COLUMNA>
COLUMNA = "Sku"
VALOR = "<% ENTRADA_1:Sku %>"
</SETEAR_VALOR_COLUMNA>

(7)

<SETEAR_VALOR_COLUMNA>
COLUMNA = "Precio"
VALOR = "<% ENTRADA_1:Precio %>"
</SETEAR_VALOR_COLUMNA>

Pagina 25

Manual CSV Robot v1.0 - Rev A

</PROCESOS>
</ROOT>
Configuracin:
(1) Se configura Entrada1.txt como archivo de datos para el registro de entrada 1
(2) Se indica que el archivo de entrada 1 posee como delimitador ;
(3) Se omite el parmetro ARCHIVO_ENTRADA_2, ya que no se necesitan datos de
otro archivo. (Se ha dejado la lnea en blanco para explicar, pero no es necesario).
(4) Se configura Salida.txt como nombre del archivo de salida donde almacenar los
resultados del script. Ntese que se omite el parmetro DELIMITADOR_SALIDA, ya
que su valor por defecto es , y es el delimitador que se desea para Salida.txt
Procesos
(5) Recordemos que el registro SALIDA inicia cada ciclo de trabajo sin columnas ni
valores. Aqu se setea el valor de la columna Nombre del registro SALIDA (como no
existe la columna previamente, se crea la misma), con el valor proveniente de la
columna Nombre del registro ENTRADA_1 (que como se sabe toma sus valores del
archivo Entrada1.txt). En resumen, esta operacin copia el valor de la columna
Nombre del registro ENTRADA_1 en el registro SALIDA, en la columna tambin
llamada Nombre.
(6) La misma operacin, copia la columna Sku al registro de salida, con nombre
tambin Sku
(7) La misma operacin, copia la columna Precio al registro de salida, con nombre
tambin Precio. Finalizada la operacin, el registro de salida, que ahora posee
columnas Nombre, Sku y Precio, se guarda en el archivo Salida.txt, empleando
, como delimitador de valores.
Luego de ejecutar este script se obtiene Salida.txt:
Nombre,Sku,Precio
Producto1,TP01,$10.00
Producto2,TP02,$12.00
Producto3,TP03,$13.00
4.1.3 Ejemplo 2 Cambio de nombres de columnas
Este ejemplo de puede encontrar en Ejemplos\Ejemplo2\Script.txt
Este ejemplo es muy similar a ejemplo 1. Se genera un archivo Salida.txt que contiene
la misma informacin que Entrada1, solo que Entrada1.txt posee como delimitador de
campos el carcter ; y Salida emplea el delimitador ,, Y ahora se aade el
requerimiento de que las columnas del archivo de salida se deben Llamar Name,
Sku y Price
Script:
<ROOT>
; Parmetros de Configuracin
; --------------------------------------------------------------<CONFIG>

Pagina 26

Manual CSV Robot v1.0 - Rev A

ARCHIVO_ENTRADA_1 = "Entrada1.txt"
DELIMITADOR_ENTRADA_1 = ";"
ARCHIVO_SALIDA = "Salida.txt"
</CONFIG>
; LISTA DE PROCESOS
; --------------------------------------------------------------<PROCESOS>
(1)
<SETEAR_VALOR_COLUMNA>
COLUMNA = "Name"
VALOR = "<% ENTRADA_1:Nombre %>"
</SETEAR_VALOR_COLUMNA>
(2)

<SETEAR_VALOR_COLUMNA>
COLUMNA = "Sku"
VALOR = "<% ENTRADA_1:Sku %>"
</SETEAR_VALOR_COLUMNA>

(3)

<SETEAR_VALOR_COLUMNA>
COLUMNA = "Price"
VALOR = "<% ENTRADA_1:Precio %>"
</SETEAR_VALOR_COLUMNA>
</PROCESOS>
</ROOT>
Configuracin:
dem a Ejemplo 1
Procesos
(1) Se realiza una copia del contenido de la columna Nombre del registro de entrada 1
a la columna Name del registro de Salida. Como dicha columna no exista
previamente, se crea antes de copiar el valor
(2) La misma operacin, copia la columna Sku al registro de salida, con nombre
tambin Sku
(3) La misma operacin, copia la columna Precio al registro de salida, con nombre
ahora Price. Finalizada la operacin (3), el registro de salida, que ahora posee
columnas Name, Sku y Price, se guarda en el archivo Salida.txt
Luego de ejecutar este script se obtiene Salida.txt:
Name,Sku,Price
Producto1,TP01,$10.00
Producto2,TP02,$12.00
Producto3,TP03,$13.00

Pagina 27

Manual CSV Robot v1.0 - Rev A

4.1.4 Ejemplo 3 Combinar dos archivos CSV en uno


Este ejemplo de puede encontrar en Ejemplos\Ejemplo3\Script.txt
Este ejemplo genera un archivo Salida.txt que contiene las columnas Name, cuyo
contenido es el mismo de la columna Nombre del archivo de Entrada 1, Sku, que
contiene el mismo contenido de la columna Sku del archivo de Entrada 1, y la
columna Description, que contiene los mismos valores que la columna Descripcion
del archivo de Entrada 2. Salida emplea el delimitador ,
Script:
<ROOT>
; Parmetros de Configuracin
; --------------------------------------------------------------<CONFIG>
(1)
ARCHIVO_ENTRADA_1 = "Entrada1.txt"
DELIMITADOR_ENTRADA_1 = ";"
(2)
ARCHIVO_ENTRADA_2 = "Entrada2.txt"
(3)
ARCHIVO_SALIDA = "Salida.txt"
</CONFIG>
; LISTA DE PROCESOS
; --------------------------------------------------------------<PROCESOS>
(4)
<SETEAR_VALOR_COLUMNA>
COLUMNA = "Name"
VALOR = "<% ENTRADA_1:Nombre %>"
</SETEAR_VALOR_COLUMNA>
(5)

<SETEAR_VALOR_COLUMNA>
COLUMNA = "Sku"
VALOR = "<% ENTRADA_1:Sku %>"
</SETEAR_VALOR_COLUMNA>

(6)

<SETEAR_VALOR_COLUMNA>
COLUMNA = "Description"
VALOR = "<% ENTRADA_2:Descripcion %>"
</SETEAR_VALOR_COLUMNA>
</PROCESOS>
</ROOT>
Configuracin:
(1) Se configura Entrada1.txt como archivo de datos para el registro de entrada 1, y se
indica que posee datos delimitados por ;
(2) Se configura Entrada2.txt como archivo de datos para el registro de entrada 2, y se
indica, por omisin del parmetro DELIMITADOR_ENTRADA_2, que posee datos
delimitados por ,
(3) Se configura el archivo de salida como Salida.txt, empleando tambin , como
delimitador.

Pagina 28

Manual CSV Robot v1.0 - Rev A

Procesos
(4) Se copia el contenido de la Columna Nombre del registro de Entrada 1 en la
columna Name del registro de salida.
(5) Se copia el contenido de la Columna Sku del registro de Entrada 1 en la columna
Sku del registro de salida.
(6) Se copia el contenido de la Columna Descripcion del registro de ENTRADA 2 en
la columna Description del registro de salida.
Luego de ejecutar este script se obtiene Salida.txt:
Name,Sku,Price,Description
Producto1,TP01,$10.00,Descripcion1
Producto2,TP02,$12.00,Descripcion2
Producto3,TP03,$13.00,Descripcion3
Nota importante: Cuando se combinan datos desde dos archivos de entrada
ENTRADA_1 y ENTRADA_2, es OBLIGATORIO, que ambos archivos posean la
misma cantidad de registros, ya que en cada ciclo de trabajo CSV Robot lee un
registro de cada archivo, aplica los procesos definidos en el script y genera un nico
registro de salida. La condicin de igualdad en la cantidad de registros de los
archivos de entrada, se verifica al momento de cargar el archivo script. Si los
archivos de entrada difieren en el numero de registros, CSV Robot lo advierte con un
mensaje de error, y no permite la ejecucin del script.
Despus de ver estos ejemplos, se puede entender la potencia que posee CSV Robot
para ejecutar tareas repetitivas sobre archivos en formato CSV. Con solo un proceso de
los que CSV pone a disposicin de los usuarios se puede ahorrar mucho tiempo de
trabajo y eliminar la posibilidad de errores al intentar convertir a mano grandes
archivos CSV.

Pagina 29

Manual CSV Robot v1.0 - Rev A

4.2 Proceso EXTRAER_TEXTO_DESDE_TEXTO


Este proceso es muy til para manipular los contenidos de los campos en los registros.
El funcionamiento de este proceso consiste en tomar un texto a procesar, el cual puede
estar especificado en forma textual o empleando Direccionamiento de variables, y
extraer del mismo una porcin de texto. La porcin a extraer se especifica entre dos
textos delimitadores denominados TAG_INICIO y TAG_FINAL, que se proporcionan
como parmetros.
Los parmetros requeridos por este proceso son:
TEXTO = TEXTO FUENTE - Obligatorio, es el texto a procesar. Se puede indicar un
texto fijo, o empleando direccionamiento de campos, procesar el contenido de una
columna del registro ENTRADA_1, ENTRADA_2 o SALIDA.
COLUMNA = "CCC" - Obligatorio, indica el nombre de la columna del REGISTRO
DE SALIDA en la cual se colocar el texto extrado. Si la columna no existe, se crea
para almacenar el valor.
TAG_INICIO = "AAA" - Obligatorio, indica el Delimitador inicial a partir del cual
extraer el texto de inters. Si se especifica TAG_INICIO = , se extrae desde el
comienzo de TEXTO_FUENTE
TAG_FINAL = "BBB" - Obligatorio, indica el delimitador final hasta el cual extraer el
texto de inters. Si se especifica TAG_FINAL = , se extrae hasta el final de
TEXTO_FUENTE
INCLUIR_TAGS = 1 - Opcional, si se incluye, su valor debe ser 1. Si este
parmetro se incluye, al resultado extrado, se le aaden TAG_INICIO y TAG_FINAL
antes de guardar en la columna destino.
Este proceso se emplea para extraer una parte determinada de un campo de un registro.
Por ejemplo, si el registro de entrada posee una columna con nombre Precio, que tiene
la forma $10.00 y se desea extraer de dicha columna el precio sin decimales y sin el
signo $ y guardarlo en la columna Price de salida, entonces se puede ejecutar el
proceso EXTRAER_TEXTO_DESDE_TEXTO, con los siguientes parmetros:
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% ENTRADA_1:Precio %>"
COLUMNA = "Price"
TAG_INICIO = "$"
TAG_FINAL = "."
</EXTRAER_TEXTO_DESDE_TEXTO>
Obsrvese que la interpretacin de este fragmento de script que hace CSV Robot es la
siguiente:
Extraer del texto contenido en la COLUMNA Precio del registro ENTRADA_1, el
fragmento de texto que se encuentra entre $ al comienzo y . al final. A ese
fragmento obtenido almacenarlo en la columna Price del registro SALIDA.
Con este proceso configurado de esa manera, se obtiene 10 a partir del texto original
$10.00.
Otros ejemplos de parmetros:

Pagina 30

Manual CSV Robot v1.0 - Rev A

(1) <EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "Texto de prueba, precio $10.25 para este producto"
COLUMNA = "Price"
TAG_INICIO = "$"
TAG_FINAL = "."
</EXTRAER_TEXTO_DESDE_TEXTO>
Almacena 10 en la columna Price
(2) <EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "Texto de prueba, precio $10.25 para este producto"
COLUMNA = "Price"
TAG_INICIO = "$"
TAG_FINAL = "."
INCLUIR_TAGS = "1"
</EXTRAER_TEXTO_DESDE_TEXTO>
Almacena $10. en la columna Price Ntese que el fragmento extrado es el mismo
que para (1), solo que ahora se aaden los tags delimitadores antes de guardar el
resultado en la columna Price
(3) <EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "Texto de prueba, precio $10.25 para este producto"
COLUMNA = "Price"
TAG_INICIO = "$"
TAG_FINAL = " "
</EXTRAER_TEXTO_DESDE_TEXTO>
Almacena 10.25 en la columna Price
(4) <EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "Texto de prueba"
COLUMNA = "Resultado"
TAG_INICIO = ""
TAG_FINAL = " "
</EXTRAER_TEXTO_DESDE_TEXTO>
Almacena Texto en la columna Resultado. Ntese que TAG_INICIO = indica
que el fragmento a extraer comienza desde el inicio del texto fuente
(5) -

Pagina 31

Manual CSV Robot v1.0 - Rev A

<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "Texto de prueba"
COLUMNA = "Resultado"
TAG_INICIO = "de "
TAG_FINAL = ""
</EXTRAER_TEXTO_DESDE_TEXTO>
Almacena prueba en la columna Resultado. Ntese que TAG_FINAL = indica
que el fragmento a extraer termina donde finaliza el texto fuente
4.2.1 Ejemplo 4 Extraccin de texto
Este ejemplo de puede encontrar en Ejemplos\Ejemplo4\Script.txt
Este ejemplo toma 1 archivo de entrada Entrada1.txt con columnas Nombre, Sku y
Precio, y genera un archivo de salida Salida.txtcon columnas Name, Sku y Price con
los valores correspondientes. La particularidad de este ejemplo es que la columna
Precio del archivo de entrada tiene la forma $10.00, y la columna Price posee la
forma 10.00 (sin $)
Entrada1.txt:
Nombre,Sku,Precio
Producto1,TP01,$10.00
Producto2,TP02,$12.00
Producto3,TP03,$13.00
Script:
<ROOT>
; Parametros de Configuracion
; --------------------------------------------------------------<CONFIG>
(1)
ARCHIVO_ENTRADA_1 = "Entrada1.txt"
(2)
ARCHIVO_SALIDA = "Salida.txt"
</CONFIG>
; LISTA DE PROCESOS
; --------------------------------------------------------------<PROCESOS>
(3)
<SETEAR_VALOR_COLUMNA>
COLUMNA = "Name"
VALOR = "<% ENTRADA_1:Nombre %>"
</SETEAR_VALOR_COLUMNA>
(4)

<SETEAR_VALOR_COLUMNA>
COLUMNA = "Sku"
VALOR = "<% ENTRADA_1:Sku %>"
</SETEAR_VALOR_COLUMNA>

Pagina 32

Manual CSV Robot v1.0 - Rev A

(5)

<SETEAR_VALOR_COLUMNA>
COLUMNA = "Price"
VALOR = "<% ENTRADA_1:Precio %>"
</SETEAR_VALOR_COLUMNA>

(6)

<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:Price %>"
COLUMNA = "Price"
TAG_INICIO = "$"
TAG_FINAL = ""
</EXTRAER_TEXTO_DESDE_TEXTO>
</PROCESOS>
</ROOT>
Configuracin:
(1) Se configura Entrada1.txt como archivo de datos para el registro de entrada 1, y
por omisin del parmetro DELIMITADOR, se asume que el archivo de entrada 1
posee como delimitador ,
(2) Se configura Salida.txt como nombre del archivo de salida donde almacenar los
resultados del script, tambin con delimitador ,.
Procesos
(3) Se realiza una copia del contenido de la columna Nombre del registro
ENTRADA_1 a la columna Name del registro SALIDA. Como dicha columna no
exista previamente, se crea antes de copiar el valor
(4) La misma operacin, copia la columna Sku al registro SALIDA, con nombre
tambin Sku
(5) La misma operacin, copia la columna Precio al registro SALIDA, con nombre
ahora Price.
(6) Se realiza un proceso EXTRAER_TEXTO_DESDE_TEXTO. Dicho proceso toma
el contenido de la columna Price del registro SALIDA (dicha columna se creo en el
paso (5) con el valor original de la columna Precio), y de la misma extrae el texto que
comienza a partir de la primera aparicin del texto $ y hasta el final del texto fuente.
El fragmento extrado se guarda en la misma columna Price del cual se tomo el texto
fuente a procesar.
4.2.2 Optimizacin del script
En el paso (6), el proceso EXTRAER_TEXTO_DESDE_TEXTO guarda el resultado de
la extraccin de texto en la columna Price del registro SALIDA. Dicha columna fue
creada previamente en el paso (5). Como el proceso
EXTRAER_TEXTO_DESDE_TEXTO verifica si la columna donde se almacena el
resultado de la operacin existe, y de no ser as, la crea antes de almacenar el valor, se
pueden reemplazar los procesos (5) y (6) por un nico proceso optimizado (5):
(5)

<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% ENTRADA_1:Precio %>"
COLUMNA = "Price"
TAG_INICIO = "$"

Pagina 33

Manual CSV Robot v1.0 - Rev A

TAG_FINAL = ""
</EXTRAER_TEXTO_DESDE_TEXTO>
Ntese que ahora, en lugar de hacer un paso previo copiando el contenido a desde la
columna Precio del registro ENTRADA_1 a una nueva columna Price, y luego
realizar el proceso de extraccin, se hace un solo paso, realizando el proceso de
extraccin desde la columna original Precio y guardando el resultado en la columna
Price que como no exista previamente, se crea para completar la operacin.
Luego de ejecutar este script se obtiene Salida.txt:
Name,Sku,Price
Producto1,TP01,10.00
Producto2,TP02,12.00
Producto3,TP03,13.00

Pagina 34

Manual CSV Robot v1.0 - Rev A

4.3 Proceso REEMPLAZAR_TEXTO_EN_TEXTO


Este proceso es muy sencillo, consiste en tomar un texto a procesar, el cual puede estar
especificado en forma textual o empleando Direccionamiento de variables, buscar en el
mismo una porcin de texto determinada, y una vez encontrada, reemplazarla por otra
porcin de texto proporcionada como parmetro.
Los parmetros requeridos por este proceso son:
TEXTO = TEXTO FUENTE - Obligatorio, es el texto a procesar. Se puede indicar un
texto fijo, o empleando direccionamiento de variables, procesar el contenido de una
columna del registro ENTRADA_1, ENTRADA_2 o SALIDA.
COLUMNA = "CCC" - Obligatorio, indica el nombre de la columna del registro
SALIDA en la cual se colocar el texto procesado. Si la columna no existe, se crea para
almacenar el valor.
BUSCAR = "AAA" - Obligatorio, es la porcin de texto que se va a buscar en TEXTO.
Tambin, puede ser un valor textual fijo, o un valor obtenido de cualquier columna
empleando el direccionamiento de variables.
REEMPLAZAR = "BBB" - Obligatorio, indica el texto que reemplazar a la porcin
indicada por el parmetro BUSCAR, en el texto TEXTO.
REPETIR = N - Opcional, si no se incluye, o su valor es 1, el proceso busca dentro
de TEXTO la primera aparicin de la porcin BUSCAR, y la reemplaza por la porcin
REEMPLAZAR, terminando el proceso. Si su valor es N, el proceso se repite
reemplazando hasta N apariciones de BUSCAR. Por ejemplo, si el texto BUSCAR
aparece 10 veces en TEXTO, y se hacer REPETIR=5, se reemplazaran las primeras 5
apariciones del texto buscado. Si se desean reemplazar todas las apariciones del texto
buscado, y no se conoce de antemano cuantas puede haber, entonces se puede fijar un
valor arbitrariamente grande a N, 100 o 200 por ejemplo.
4.3.1 Ejemplo 5 Reemplazo de texto
Este ejemplo de puede encontrar en Ejemplos\Ejemplo5\Script.txt
Se dispone del siguiente archivo Entrada1.txt:
Nombre,Sku,Precio
Producto1,TP01,$10.00
Producto2,TP02,$12.00
Producto3,TP03,$13.00
Y se desea obtener un archivo Salida.txt con la misma informacin, pero se desea que el
campo Precio, contenga valores SIN el signo $ y reemplazando el signo decimal . Por
la coma ,.
Script:
<ROOT>
; Parametros de Configuracion
; --------------------------------------------------------------<CONFIG>
(1)
ARCHIVO_ENTRADA_1 = "Entrada1.txt"

Pagina 35

Manual CSV Robot v1.0 - Rev A

(2)
ARCHIVO_SALIDA = "Salida.txt"
</CONFIG>
; LISTA DE PROCESOS
; --------------------------------------------------------------<PROCESOS>
(3)
<SETEAR_VALOR_COLUMNA>
COLUMNA = "Nombre"
VALOR = "<% ENTRADA_1:Nombre %>"
</SETEAR_VALOR_COLUMNA>
(4)

<SETEAR_VALOR_COLUMNA>
COLUMNA = "Sku"
VALOR = "<% ENTRADA_1:Sku %>"
</SETEAR_VALOR_COLUMNA>

(5)

<SETEAR_VALOR_COLUMNA>
COLUMNA = "Precio"
VALOR = "<% ENTRADA_1:Precio %>"
</SETEAR_VALOR_COLUMNA>

(6)

<REEMPLAZAR_TEXTO_EN_TEXTO>
TEXTO = "<% SALIDA:Precio %>"
COLUMNA = "Precio"
BUSCAR = "$"
REEMPLAZAR = ""
</REEMPLAZAR_TEXTO_EN_TEXTO>

(7)

<REEMPLAZAR_TEXTO_EN_TEXTO>
TEXTO = "<% SALIDA:Precio %>"
COLUMNA = "Precio"
BUSCAR = "."
REEMPLAZAR = ","
</REEMPLAZAR_TEXTO_EN_TEXTO>
</PROCESOS>
</ROOT>
Configuracin:
(1) Se configura Entrada1.txt como archivo de datos para el registro de entrada 1, y
por omisin del parmetro DELIMITADOR, se asume que el archivo de entrada 1
posee como delimitador ,
(2) Se configura Salida.txt como nombre del archivo de salida donde almacenar los
resultados del script, tambin con delimitador ,.
Procesos
(3) Se realiza una copia del contenido de la columna Nombre del registro
ENTRADA_1 a la columna Nombre del registro SALIDA. Como dicha columna no
exista previamente en el registro SALIDA, se crea antes de copiar el valor
(4) La misma operacin, copia la columna Sku al registro SALIDA, con nombre
tambin Sku

Pagina 36

Manual CSV Robot v1.0 - Rev A

(5) La misma operacin, copia la columna Precio al registro SALIDA, con nombre
ahora Precio.
(6) Se realiza un proceso REEMPLAZAR_TEXTO_EN_TEXTO. Dicho proceso toma
el contenido de la columna Precio del registro SALIDA (dicha columna se creo en el
paso (5) con el valor original de la columna Precio), y en el contenido de dicha
columna, BUSCA la primera aparicin de $ y la REEMPLAZA por , es decir,
elimina la aparicin de $.El texto resultante de este proceso se guarda nuevamente en
la columna Precio del registro SALIDA.
(7) Se realiza un proceso REEMPLAZAR_TEXTO_EN_TEXTO. Dicho proceso toma
el contenido de la columna Precio del registro SALIDA, y en el contenido de dicha
columna, BUSCA la primera aparicin de . y la REEMPLAZA por ,.El texto
resultante de este proceso se guarda nuevamente en la columna Precio
Luego de ejecutar este script se obtiene Salida.txt:
Name,Sku,Price
Producto1,TP01,"10,00"
Producto2,TP02,"12,00"
Producto3,TP03,"13,00"
Nota Importante: en el archivo de salida, la columna Precio posee los valores de
cada registro encerrados entre comillas dobles. Eso es porque el valor de esa columna
contiene un carcter , que es el mismo que se emplea como delimitador de campos
para el archivo de salida. El cierre de valores entre comillas se realiza
automticamente por CSV Robot cuando detecta que el valor de un campo posee en
su interior el mismo carcter que se emplea como delimitador en el archivo. Si en el
script se hubiese empleado ; como delimitador del archivo Salida.txt, todos los
campos estaran separados por ; y el campo precio no estara encerrado entre
comillas, porque ya no sera necesario.

Pagina 37

Manual CSV Robot v1.0 - Rev A

4.4 Proceso QUITAR_COLUMNA


Este proceso es muy sencillo, y a primera vista carece de utilidad, aunque a medida que
se estudien el resto de los procesos se ver que a veces es necesario, cuando se emplean
columnas en forma temporal.
El Proceso QUITAR_COLUMNA simplemente elimina una columna del registro
SALIDA.
Toma un nico parmetro COLUMNA, el cual es obligatorio, e indica el nombre de la
columna a eliminar.
Es un proceso muy simple, por lo que se explica rpidamente con un ejemplo sencillo:
Ejemplo:
<PROCESOS>
.
.
(1)

<SETEAR_VALOR_COLUMNA>
COLUMNA = "Temp"
VALOR = "<% ENTRADA_1:Nombre %>"
</SETEAR_VALOR_COLUMNA>
.
.
.

(2)

<QUITAR_COLUMNA>
COLUMNA = "Temp"
</ QUITAR_COLUMNA >
.
.
</PROCESOS>
Procesos
(1) Se realiza una copia del contenido de la columna Nombre del registro
ENTRADA_1 a la columna Temp del registro SALIDA. Si dicha columna no exista
previamente, se crea antes de copiar el valor
(2) Luego de una serie de procesos, que emplearon el contenido de la columna Temp
para diversas operaciones, se decide eliminar dicha columna del registro SALIDA, para
que no aparezca al final del proceso en el archivo de salida. Entonces de ejecuta el
proceso QUITAR_COLUMNA indicando que elimine la columna Temp.

Pagina 38

Manual CSV Robot v1.0 - Rev A

5. Procesos orientados al Web Scraping


5.1 Que es el Web Scraping?
El Web Scraping se puede considerar como un proceso que analiza y extrae informacin
de un sitio web. Las pginas que ofrecen los sitios web se codifican en HTML, es decir,
utilizan una estructura de rbol para representar la informacin de manera que sta se
mezcla con el diseo, lo que hace que los datos que realmente interesan no se puedan
manejar o comparar fcilmente y de una manera inmediata.
El proceso consiste bsicamente en simular a una persona que se halle navegando por
un sitio web. En primer lugar, se conecta al sitio web y le solicita una pgina, tal y como
lo hara un navegador. El servidor web le devuelve la pgina y la aplicacin de Web
Scraping recoge la informacin de inters en un formato que luego se puede procesar.
CSV Robot permite realizar web scraping de una pagina web, y recuperar informacin
de la misma, dicha informacin puede ser texto, que se almacena en archivos CSV, Pero
CSV Robot no se limita a recuperar solo texto, sino que tambin puede descargar
contenido HTML, imgenes, y archivos.
Nota: Si bien las funciones de web scraping de CSV Robot son muy sencillas,
implementar un caso particular de web scraping sobre un determinado sitio puede no
serlo. Es necesario tener un buen conocimiento de HTML para poder determinar los
procesos y parmetros a emplear en el script de CSV Robot para extraer la
informacin de nuestro inters.
5.1 Proceso DESCARGAR_HTML
Este proceso es el pilar fundamental del web scraping. Este proceso recibe como
parmetro el Link de una pgina web, y descarga todo el contenido Html de la misma en
una columna del registro de salida.
Los parmetros requeridos por este proceso son:
LINK = http://www.pagina.com - Obligatorio, es el link de la pagina a descargar. Es
obligatorio tambin que comience con http://www.
COLUMNA = "CCC" - Obligatorio, indica el nombre de la columna del registro
SALIDA en la cual se colocar la pagina descargada. Si la columna no existe, se crea
para almacenar el valor.
Obviamente, el proceso DESCARGAR_HTML no tiene razn de ser si luego no se
aplican procesos de extraccin de informacin. El contenido completo de una pagina
html guardado en un archivo CSV es algo ilgico, por lo cual, este proceso siempre es
el punto de partida a una serie de operaciones para recuperar datos tiles a partir de la
pgina descargada.
5.1.1 Ejemplo 6 Extraccin de informacin de una tienda online
Este ejemplo de puede encontrar en Ejemplos\Ejemplo6\Script.txt
Demostraremos como ejemplo el empleo de los procesos estudiados hasta el momento
en una aplicacin real, y realizada muy frecuentemente: La extraccin de informacin
desde una tienda online.

Pagina 39

Manual CSV Robot v1.0 - Rev A

Para ello, planteamos como ejemplo la necesidad de extraer los nombres y precios de
varios productos de la siguiente tienda online:
http://www.e-crazydeals.com
Las razones por las que necesitamos acceder a los productos de esta web y extraer
informacin pueden ser muy variadas, por ejemplo:
- Vendemos los mismos productos en ebay y deseamos tener un proceso automatizado
que extraiga los precios de los productos que comercializamos de varias webs, para
comparar con nuestros precios
- La tienda es nuestro proveedor, y con este proceso automatizado podemos extraer
imgenes, descripciones y precios para luego aadir a nuestra propia tienda.
Si navegamos por la tienda e ingresamos a la pagina de un producto, por ejemplo:
http://www.e-crazydeals.com/store/index.php/ramos-w19-v2-0-tablet-pc-android-4-0-3cortex-a9-dual-camera-8gb.html
Vemos una pagina de producto con nombre, descripcin, imgenes, precio, etc.
Si entramos a las pginas de varios productos de la tienda y empleamos alguna
herramienta que nos permita ver la estructura html de la pgina (muy recomendable
google chrome, opcin inspeccionar elemento del men contextual), veremos que se
repite constantemente la misma estructura, y solo varia el contenido. Esto es muy
comn, porque estas tiendas mantienen su informacin en una base de datos y cuando se
accede a la pgina de un producto, se emplea una plantilla que se rellena con la
informacin referente al producto que estamos viendo.
5.1.2 Anlisis de la estructura de la pgina
Siempre para poder encarar un proceso de extraccin de informacin de la web, es
necesario analizar la estructura de las pginas de la web en la que me interesa extraer la
informacin.
Para este ejemplo, intentamos acceder a las pginas de varios productos de una tienda
online, y recuperar de las mismas nombre del producto y precio.
Si ingresamos a la pgina de cualquier producto de la tienda y analizamos su estructura
veremos lo siguiente:
1 - El nombre del producto se encuentra en un DIV de la siguiente forma:
.<div class="product-name" sourceindex="128"
siber__q92dpb7seovvtbh5__vptr="11a2f20"><h1 sourceindex="129"
siber__q92dpb7seovvtbh5__vptr="11a01b0">Ramos W19 V2.0 Tablet PC Android
4.0.3 Cortex A9 Dual Camera 8GB</h1></div>.
Es importante al analizar una pgina para hacer web scraping, ubicar los elementos
estructurales del html de la pgina. En el texto, se han coloreado con azul los mismos.
Estos elementos normalmente no variaran dentro de la misma web, independientemente
del producto que estemos visualizando, y nos sern de utilidad para encontrar y extraer
la informacin que nos interesa.

Pagina 40

Manual CSV Robot v1.0 - Rev A

2 - El precio del producto se encuentra en un DIV de la siguiente forma:


<span class="price">$125.00</span>
Para extraer la informacin que nos interesa, armaremos un script que instruya a CSV
Robot a realizar las siguientes tareas:
1 Se toma desde un archivo de entrada un link de una de las pginas de las que se
desea extraer la informacin
2 Con ese link, descargaremos la pgina completa del producto.
3 Con el proceso extraer texto recuperaremos de la pagina completa la porcin
correspondiente al nombre del producto
4 - Con el proceso extraer texto recuperaremos de la pagina completa la porcin
correspondiente al precio del producto
5 Guardaremos el resultado en un archivo de salida
5.1.3 El ejemplo paso a paso: El archivo de entrada Links.txt
Crearemos un archivo txt en formato CSV con el siguiente contenido (el archivo
contiene 3 lneas de texto):
ID,Link
Producto001,http://www.e-crazydeals.com/store/index.php/ramos-w19-v2-0-tablet-pcandroid-4-0-3-cortex-a9-dual-camera-8gb.html
Producto002,http://www.e-crazydeals.com/store/index.php/cube-mini-u30gt-tablet-pcrk3066-7-0-inch-android-4-0-16gb-1g-ram-win8-ui-white.html
Producto003,http://www.e-crazydeals.com/store/index.php/yeahpad-a13-tablet-pc-7inch-ultra-thin-android-4-0-4gb-camera-black.html
Este archivo es el que alimentar a CSV Robot con los links de las pginas de las cuales
deseo extraer la informacin. El campo ID ser empleado en ejemplos mas adelante.
5.1.4 El ejemplo paso a paso: El archivo Script.txt
Ahora crearemos el archivo de script, comenzado por la configuracin del proyecto:
; Parametros de Configuracion
; --------------------------------------------------------------<CONFIG>
ARCHIVO_ENTRADA_1 = "Links.txt"
ARCHIVO_SALIDA = "Salida.txt"
</CONFIG>
Se definen archivos de entrada y salida, y como se omiten los parmetros de
delimitadores, se asume que ambos emplean el carcter ,.
Deseamos que el archivo de salida contenga 3 columnas: ID,Nombre y Precio. El valor
ID proviene de la columna ID del archivo de entrada Links.txt, y los campos Nombre
y Precio, provienen del contenido HTML de la pgina del producto, por lo que si
recordamos que el proceso DESCARGAR_HTML obtiene una pagina en html y guarda

Pagina 41

Manual CSV Robot v1.0 - Rev A

el contenido en una columna del registro de salida, entonces ser necesario emplear una
columna temporal para almacenar el HTML descargado y procesarlo.
Empezaremos por copiar ID del registro de entrada al registro de Salida
<PROCESOS>
<SETEAR_VALOR_COLUMNA>
COLUMNA = "ID"
VALOR = "<% ENTRADA_1:ID %>"
</SETEAR_VALOR_COLUMNA>
Ahora, realizaremos la descarga de la pagina, empleando el link que proviene del
archivo de entrada:
<DESCARGAR_HTML>
COLUMNA = "TEMP_HTML"
LINK = "<% ENTRADA_1:Link %>"
</DESCARGAR_HTML>
Este proceso descarga el html de una pgina, en una columna destino del registro
SALIDA. A esa columna la hemos llamado TEMP_HTML. Como la columna no existe
previamente, se crea para la operacin. La direccin de la pgina se provee al proceso
con el parmetro LINK, que en este caso, toma su valor de la columna Link del registro
ENTRADA_1 (los links que proporcionamos como datos en el archivo Links.txt).
Nota: Emplear una columna temporal tiene el objeto principal de facilitar el
entendimiento del ejemplo, aunque en este caso, tambin mejora el rendimiento y
reduce el tiempo de ejecucin del script, veamos por que:
La descarga el html de la pgina toma cierto tiempo, debido a que CSV Robot debe
acceder a la web, y descargar el html de la pgina, y dependiendo de la congestin de
la red, la velocidad de conexin que disponemos, y otros factores, esto puede tomar
mas o menos tiempo.
Si descargramos por ejemplo el html de la pgina directamente en la columna
Nombre, y luego procesamos esa columna para extraer la informacin necesaria al
nombre del producto, luego de obtenido el nombre del producto, el contenido original
descargado de la pagina se habra destruido, y lo necesitamos nuevamente para
extraer la informacin de precio, lo cual nos obligara a descargar nuevamente el
html completo en la columna precio, y luego procesar nuevamente, con lo cual las
demoras originadas del acceso a la web se duplican. El empleo de una columna
temporal, nos permite realizar una nica descarga, y disponer de esa informacin
para extraer todo lo que nos interesa. Finalmente, la columna temporal se eliminar
para evitar que aparezca en el archivo de salida.
Ahora, procederemos a extraer la informacin de Nombre del producto. Para ello,
veamos nuevamente la estructura de la pgina html para definir que parmetros emplear
en el proceso EXTRAER_TEXTO para recuperar la informacin til:
.<div class="product-name" sourceindex="128"
siber__q92dpb7seovvtbh5__vptr="11a2f20"><h1 sourceindex="129"
siber__q92dpb7seovvtbh5__vptr="11a01b0">Ramos W19 V2.0 Tablet PC Android
4.0.3 Cortex A9 Dual Camera 8GB</h1></div>.

Pagina 42

Manual CSV Robot v1.0 - Rev A

Aqu tenemos el inconveniente de que las partes de texto coloreadas en rojo cambian
entre distintos productos. Lo que se mantiene es lo que est en azul.
Lo que a primera vista parece mas lgico para extraer el nombre del producto sera
definir el proceso EXTRAER_TEXTO de forma que extraiga el texto contenido entre
> y </h1>:
.<div class="product-name" sourceindex="128"
siber__q92dpb7seovvtbh5__vptr="11a2f20"><h1 sourceindex="129"
siber__q92dpb7seovvtbh5__vptr="11a01b0">Ramos W19 V2.0 Tablet PC Android
4.0.3 Cortex A9 Dual Camera 8GB</h1></div>.
con lo cual, el resultado de la extraccin sera Ramos W19 V2.0 Tablet PC Android
4.0.3 Cortex A9 Dual Camera 8GB.
Se puede hacer de esta manera, pero lo mas probable es que no resulte de la forma
esperada.
Por que?:
La etiqueta <h1></h1> se emplea en html para definir un titulo de cierto tamao, y es
muy probable que el formato >TEXTO</h1> se encuentre varias veces en
la misma pgina. Si intentamos extraer informacin de una pgina completa html solo
definiendo que la informacin est contenida entre > y </h1>, el proceso recuperar
el primer texto que encuentre entre esas etiquetas, y es muy probable que el resultado no
sea lo que estamos buscando. Para que el proceso tenga xito, debemos hacer la
bsqueda en varias etapas, para acercarnos a la informacin que nos interesa y evitar
errores.
La etiqueta <div> tambin es muy comn, por lo que si especificamos la extraccin
entre <div y </div> obtendremos el primer elemento DIV del html y es muy
probable que no sea lo que estamos buscando.
Lo que haremos es intentar proporcionar la mayor cantidad de informacin posible al
proceso de extraccin, para que identifique exactamente la porcin de texto que nos est
interesando recuperar.
Analizando la estructura de la pgina que empleamos en el ejemplo, vemos que el
elemento html DIV en el que se encuentra el nombre del producto, emplea el atributo
class=product-name (No entraremos en detalles de html y Css, solo diremos que este
atributo se emplea para asignar un formato de color, tipo de letra, etc. al elemento). Este
atributo, SOLO SE APLICA al DIV en el que esta el nombre del producto, por lo que
nos es de utilidad para discriminar este DIV como nico en la pgina.
El primer proceso de extraccin ser el siguiente:
<EXTRAER_TEXTO_DESDE_TEXTO>
(1)
TEXTO = "<% SALIDA:TEMP_HTML %>"
(2)
COLUMNA = "Nombre"
(3)
TAG_INICIO = "<div class=\"product-name\""
(4)
TAG_FINAL = "</div>"
</EXTRAER_TEXTO_DESDE_TEXTO>
Aqu estamos definiendo:
1- El texto a procesar se encuentra en la columna TEMP_HTML del registro de
SALIDA (columna que fue creada previamente por el proceso DESCARGAR_HTML).

Pagina 43

Manual CSV Robot v1.0 - Rev A

2 El resultado de la extraccin se almacena en la columna Nombre del registro de


SALIDA. Como la columna no existe hasta el momento, en este paso tambin se crea la
misma
3 y 4 El texto a extraer es el que se encuentra entre <div class="product-name" y
</div>
Nota muy importante: Como se observa en el proceso, el tag de inicio no se escribe
TAG_INICIO = "<div class="product-name"" sino que en su lugar se escribe
TAG_INICIO = "<div class=\"product-name\"". La diferencia radica en el agregado
del carcter \ antes de las comillas dobles. El motivo de esto es que CSV Robot, al
momento de leer los parmetros del archivo de script, identifica el nombre del
parmetro y el valor de la siguiente manera:
NOMBRE_PARAMETRO = VALOR_PARAMETRO
CSV Robot asume que el signo = separa el nombre del parmetro de su valor, y que
el valor del parmetro se encuentra entre comillas. Ahora bien, que ocurre si
VALOR_PARAMETRO en si mismo posee comillas dobles en su contenido? (algo
muy comn cuando extraemos texto desde un origen HTML). Para evitar que esto
provoque un error de interpretacin por parte de CSV Robot, a todas las comillas
dobles que formen parte del VALOR del parmetro, se les DEBE ANTEPONER EL
CARCTER \ (Ver introduccin a los archivos CSV al comienzo de este manual).
Volviendo al proceso, el resultado de la primera extraccin, para el registro de ejemplo
sera:
(Resultado 1)
sourceindex="128" siber__q92dpb7seovvtbh5__vptr="11a2f20"><h1
sourceindex="129" siber__q92dpb7seovvtbh5__vptr="11a01b0">Ramos W19 V2.0
Tablet PC Android 4.0.3 Cortex A9 Dual Camera 8GB</h1>
Que an no es lo que estamos buscando. Nuevamente, a primera impresin parecera
que lo lgico ahora fuera realizar una segunda extraccin > y </h1>, entonces
aadimos el siguiente proceso:
<EXTRAER_TEXTO_DESDE_TEXTO>
(1)
TEXTO = "<% SALIDA: Nombre %>"
(2)
COLUMNA = "Nombre"
(3)
TAG_INICIO = ">"
(4)
TAG_FINAL = "</h1>"
</EXTRAER_TEXTO_DESDE_TEXTO>
Aqu estamos definiendo:
1- El texto a procesar se encuentra en la columna Nombre del registro de SALIDA
(columna que fue destino del primer proceso de extraccin de texto).
2 El resultado de la extraccin se almacena en la misma columna Nombre del
registro de SALIDA.
3 y 4 El texto a extraer es el que se encuentra entre > y </h1>
De este proceso, nosotros pensaramos recuperar:
Ramos W19 V2.0 Tablet PC Android 4.0.3 Cortex A9 Dual Camera 8GB

Pagina 44

Manual CSV Robot v1.0 - Rev A

Pero en realidad obtendramos:


(Resultado 2)
<h1 sourceindex="129" siber__q92dpb7seovvtbh5__vptr="11a01b0">Ramos W19
V2.0 Tablet PC Android 4.0.3 Cortex A9 Dual Camera 8GB
Porque no obtenemos el nombre el producto?
Lo que ocurre es que estamos definiendo como carcter delimitador inicial > y ese
carcter delimitador, en el resultado previo obtenido (Resultado 1), aparece una vez
antes del nombre del producto
(Resultado 1)
sourceindex="128" siber__q92dpb7seovvtbh5__vptr="11a2f20"><h1
sourceindex="129" siber__q92dpb7seovvtbh5__vptr="11a01b0">Ramos W19 V2.0
Tablet PC Android 4.0.3 Cortex A9 Dual Camera 8GB</h1>
Por ello estamos obteniendo el texto en azul.
Esto nos obliga a incorporar una tercera extraccin de texto:
<EXTRAER_TEXTO_DESDE_TEXTO>
(1)
TEXTO = "<% SALIDA: Nombre %>"
(2)
COLUMNA = "Nombre"
(3)
TAG_INICIO = ">"
(4)
TAG_FINAL = ""
</EXTRAER_TEXTO_DESDE_TEXTO>
Aqu estamos definiendo:
1- El texto a procesar se encuentra en la columna Nombre del registro de SALIDA.
2 El resultado de la extraccin se almacena en la misma columna Nombre del
registro de SALIDA.
3 y 4 El texto a extraer es el que se encuentra entre > y .
Nota importante: Recordar que si se define TAG_INICIO= y
TAG_FINAL=NNN, el proceso recupera la porcin de informacin definida entre
el COMIENZO DEL TEXTO, y el delimitador final NNN. Si en cambio, se define
TAG_INICIO=NNN y TAG_FINAL=, el proceso recupera la porcin de
informacin definida desde la primera aparicin de NNN en el texto, y a partir de
all, recupera todo el texto restante.
En este caso, como el resultado del proceso 2 de extraccin es:
(Resultado 2)
<h1 sourceindex="129" siber__q92dpb7seovvtbh5__vptr="11a01b0">Ramos W19
V2.0 Tablet PC Android 4.0.3 Cortex A9 Dual Camera 8GB
A nosotros nos interesa recuperar desde el carcter > hasta el final del texto.
Este ultimo proceso, nos retorna el Nombre limpio del producto en la columna
Nombre.

Pagina 45

Manual CSV Robot v1.0 - Rev A

Recapitulando, la secuencia de procesos para obtener desde la pgina completa de


producto, descargada en la columna TEMP_HTML, la porcin de informacin referente
al nombre del producto en la columna Nombre es la siguiente:
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "Nombre"
TAG_INICIO = "<div class=\"product-name\""
TAG_FINAL = "</div>"
</EXTRAER_TEXTO_DESDE_TEXTO>
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA: Nombre %>"
COLUMNA = "Nombre"
TAG_INICIO = ">"
TAG_FINAL = "</h1>"
</EXTRAER_TEXTO_DESDE_TEXTO>
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA: Nombre %>"
COLUMNA = "Nombre"
TAG_INICIO = ">"
TAG_FINAL = ""
</EXTRAER_TEXTO_DESDE_TEXTO>
Ahora, para extraer el precio del producto:
<span class="price">$125.00</span>
Es una tarea mas sencilla, que se puede ejecutar en un proceso nico de extraccin:
<EXTRAER_TEXTO_DESDE_TEXTO>
(1)
TEXTO = "<% SALIDA:TEMP_HTML %>"
(2)
COLUMNA = "Precio"
(3)
TAG_INICIO = "<span class=\"price\">"
(4)
TAG_FINAL = "</span>"
</EXTRAER_TEXTO_DESDE_TEXTO>
Aqu estamos definiendo:
1- El texto a procesar se encuentra en la columna TEMP_HTML del registro de
SALIDA (columna que fue creada previamente por el proceso DESCARGAR_HTML).
Aqu se observa la utilidad de emplear una columna temporal para almacenar el html de
la pgina y extraer la informacin necesaria sin destruir su contenido, a fin de optimizar
el tiempo de procesamiento.
2 El resultado de la extraccin se almacena en la columna Precio del registro de
SALIDA. Como la columna no existe hasta el momento, en este paso tambin se crea la
misma
3 y 4 El texto a extraer es el que se encuentra entre <span class="price"> y </span>
aqu tambin aplica la necesidad de anteponer \ a todas las comillas dobles que
forman parte del valor del parmetro TAG_.

Pagina 46

Manual CSV Robot v1.0 - Rev A

Este proceso, luego de ejecutarse retornar $125.00 en la columna Precio del


registro de salida.
Nota: Si necesitramos el precio sin el signo $, podramos emplear
TAG_INICIO = "<span class=\"price\"$>" para extraer despus del signo $.
Ya disponemos del nombre del producto en la columna Nombre y el precio en la
columna Precio, pero aun nos falta el ultimo paso, que consiste en eliminar la
columna TEMP_HTML que ahora no es necesaria y no queremos que aparezca en el
archivo de SALIDA:
<QUITAR_COLUMNA>
COLUMNA = "TEMP_HTML"
</ QUITAR_COLUMNA >
El script completo del ejemplo 5, es el siguiente:
<ROOT>
; Parametros de Configuracion
; --------------------------------------------------------------<CONFIG>
ARCHIVO_ENTRADA_1 = "Links.txt"
ARCHIVO_SALIDA = "Salida.txt"
</CONFIG>
; LISTA DE PROCESOS
; --------------------------------------------------------------<PROCESOS>
<SETEAR_VALOR_COLUMNA>
COLUMNA = "ID"
VALOR = "<% ENTRADA_1:ID %>"
</SETEAR_VALOR_COLUMNA>
<DESCARGAR_HTML>
COLUMNA = "TEMP_HTML"
LINK = "<% ENTRADA_1:Link %>"
</DESCARGAR_HTML>
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "Nombre"
TAG_INICIO = "<div class=\"product-name\""
TAG_FINAL = "</div>"
</EXTRAER_TEXTO_DESDE_TEXTO>
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA: Nombre %>"
COLUMNA = "Nombre"
TAG_INICIO = ">"

Pagina 47

Manual CSV Robot v1.0 - Rev A

TAG_FINAL = "</h1>"
</EXTRAER_TEXTO_DESDE_TEXTO>
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA: Nombre %>"
COLUMNA = "Nombre"
TAG_INICIO = ">"
TAG_FINAL = ""
</EXTRAER_TEXTO_DESDE_TEXTO>
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "Precio"
TAG_INICIO = "<span class=\"price\">"
TAG_FINAL = "</span>"
</EXTRAER_TEXTO_DESDE_TEXTO>
<QUITAR_COLUMNA>
COLUMNA = "TEMP_HTML"
</QUITAR_COLUMNA >
</PROCESOS>
</ROOT>

Pagina 48

Manual CSV Robot v1.0 - Rev A

5.2 Proceso CREAR_DIRECTORIO


Este proceso es otro proceso muy simple que proporciona CSV Robot, y muy til para
web scraping. Este proceso recibe como parmetro NOMBRE_DIRECTORIO, que
como siempre puede ser en forma textual o empleando direccionamiento de variables, y
crea una subcarpeta o subdirectorio con ese nombre en la carpeta donde actualmente se
encuentra el script que se esta ejecutando.
5.2.1 Ejemplo 7 Creacin de directorios
Este ejemplo de puede encontrar en Ejemplos\Ejemplo7\Script.txt
Este ejemplo consiste en una ampliacin del ejemplo 6. Deseamos, adems de haber
obtenido la informacin de los productos que nos interesaban de la tienda online, crear
en la misma carpeta en la que se encuentra el script, un directorio por cada producto.
Emplearemos como nombre del directorio el ID del producto.
Script (ampliacin de ejemplo 6):
..
..
..
<CREAR_DIRECTORIO>
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
</CREAR_DIRECTORIO>
<QUITAR_COLUMNA>
COLUMNA = "TEMP_HTML"
</QUITAR_COLUMNA >
</PROCESOS>
</ROOT>
Se ha insertado este proceso antes de eliminar la columna TEMP_HTML por cuestiones
de mantener el orden.
Luego de ejecutar este script se obtiene Salida.txt con ID, nombre y precio de cada
producto de inters, y un directorio por cada ID procesado, es decir, se han creado 3
nuevos subdirectorios:
Producto001
Producto002
Producto003

Pagina 49

Manual CSV Robot v1.0 - Rev A

5.3 Proceso CREAR_ARCHIVO


Este proceso permite crear un archivo de texto, y almacenar en dicho archivo el
contenido de una columna de un registro.
Los parmetros requeridos por este proceso son:
NOMBRE_DIRECTORIO = DDD - Obligatorio, es el directorio en el cual se crear
el archivo. Si se especifica como valor del parmetro, el archivo se creara en el
mismo directorio del script.
NOMBRE_ARCHIVO = AAA - Obligatorio, indica el nombre que se le asignar al
archivo creado
CONTENIDO_ARCHIVO = CCC - Obligatorio, indica el contenido que se
almacenar en el archivo creado.
Hay que recordar que todos estos parmetros se pueden indicar textualmente, por
ejemplo:

<PROCESOS>
<CREAR_ARCHIVO>
NOMBRE_DIRECTORIO = "Data"
NOMBRE_ARCHIVO = "Archivo.txt"
CONTENIDO_ARCHIVO = "Test"
</ CREAR_ARCHIVO >
</PROCESOS>
.
Lo cual no tiene mucho sentido, porque en cada ciclo de ejecucin, se crear el mismo
archivo Archivo.txt, con el mismo contenido Test, y en el mismo directorio Data,
por lo cual al terminar la ejecucin del script, se encontrar un nico archivo creado,
O se puede emplear la sintaxis de direccionamiento indirecto como se ver en el
ejemplo:
5.3.1 Ejemplo 8 Creacin de archivos
Este ejemplo es una continuacin del ejemplo 7. Vamos a ampliar el ejemplo, ahora
descargando la descripcin completa de cada producto desde la pgina web, pero a esa
descripcin descargada la almacenaremos en el directorio del producto (creado en el
ejemplo 7) en un archivo llamado descripcin.html
Primero veamos como descargamos la descripcin.
Si entramos a alguno de los productos de la pgina (emplearemos la misma direccin de
ejemplo que hemos empleado hasta el momento):
http://www.e-crazydeals.com/store/index.php/ramos-w19-v2-0-tablet-pc-android-4-0-3cortex-a9-dual-camera-8gb.html
Y empleamos la funcin Inspeccionar Elemento de google chrome para ver la
estructura de la pgina, podemos observar que la descripcin del producto es una tabla
html de la forma:

Pagina 50

Manual CSV Robot v1.0 - Rev A

<table border="1" cellpadding="0" cellspacing="0" width="649" style="bordercollapse:collapse" ;="" border-spacing:="" 0;="" empty-cells:="" show;="" fontsize:="" 100%="">
<tbody>

</tbody>
</table>
Siempre es recomendable, si vamos a descargar informacin de varias pginas, recorrer
cada una de ellas y verificar cuales son las estructuras html que se repiten en todas, para
a partir de ellas, armar los procesos de extraccin y asegurarnos de que podremos
recuperar la informacin sin importar a qu pgina de producto ingresamos. En este
caso, es sencillo porque esta es la nica tabla que posee la pgina.
El proceso de extraccin para esta tabla es el siguiente:
<EXTRAER_TEXTO_DESDE_TEXTO>
(1)
TEXTO = "<% SALIDA:TEMP_HTML %>"
(2)
COLUMNA = "TEMP_DESCRIPCION"
(3)
TAG_INICIO = "<table border=\"1\""
(4)
TAG_FINAL = "</table>"
(5)
INCLUIR_TAGS = "1"
</EXTRAER_TEXTO_DESDE_TEXTO>
Aqu estamos definiendo:
1- El texto a procesar se encuentra en la columna TEMP_HTML del registro
SALIDA (ver ejemplo 6).
2 El resultado de la extraccin se almacenar en una columna temporal
TEMP_DESCRIPCION del registro SALIDA. Se emplea una columna temporal porque
necesitamos un almacenamiento para luego crear el archivo con su contenido. Esta
columna se eliminar antes de terminar el script
3 y 4 El texto a extraer es el que se encuentra entre <table border="1" y </table> aqu
tambin aplica la necesidad de anteponer \ a todas las comillas dobles que forman
parte del valor del parmetro TAG_.
5 Como lo que estamos extrayendo es una tabla HTML, y nos interesa recuperarla
completa, se agrega la opcin INCLUIR_TAGS = "1", con lo cual, luego de extraer el
texto, se aaden los tags inicial y final para mantener la tabla completa.
Al ejecutar este proceso, obtenemos la tabla html en la columna
TEMP_DESCRIPCION. Ahora crearemos el archivo con el contenido de esa columna:
<CREAR_ARCHIVO>
(1)
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
(2)
NOMBRE_ARCHIVO = "Descripcion.html"
(3)
CONTENIDO_ARCHIVO = "<% SALIDA:TEMP_DESCRIPCION%>"
</ CREAR_ARCHIVO >
Aqu estamos definiendo:

Pagina 51

Manual CSV Robot v1.0 - Rev A

1- El directorio en el cual se creara el archivo esta en la columna ID del registro


ENTRADA_1 (Recordemos que el proceso CREAR_DIRECTORIO crea un directorio
previamente con ese nombre, por lo que se va a crear para cada producto, un directorio
propio, y dentro de ese directorio, un archivo.
2 El nombre del archivo que se va a crear dentro del directorio del producto siempre
es Descripcion.html
3 El contenido del archivo, es la tabla recuperada en la columna
TEMP_DESCRIPCION del registro SALIDA
Al ejecutar este proceso, obtenemos un archivo Descripcion.html creado en el directorio
con nombre del ID de cada producto.
Finalmente, no hay que olvidar eliminar la columna TEMP_DESCRIPCION antes de
terminar el script
<QUITAR_COLUMNA>
COLUMNA = "TEMP_DESCRIPCION"
</QUITAR_COLUMNA >
Esta es la trascripcin completa del script del ejemplo 8. Se han resaltado con color los
procesos aadidos para este ejemplo:
<ROOT>
; Parametros de Configuracion
; --------------------------------------------------------------<CONFIG>
ARCHIVO_ENTRADA_1 = "Links.txt"
ARCHIVO_SALIDA = "Salida.txt"
</CONFIG>
; LISTA DE PROCESOS
; --------------------------------------------------------------<PROCESOS>
;Copiar columna ID desde ENTRADA_1 a SALIDA
; -------------------------------------<SETEAR_VALOR_COLUMNA>
COLUMNA = "ID"
VALOR = "<% ENTRADA_1:ID %>"
</SETEAR_VALOR_COLUMNA>
; Descargar HTML empleando como link la columna
; Link de ENTRADA_1
; El HTML descargado se almacena en la columna
; TEMP_HTML de SALIDA
; -------------------------------------<DESCARGAR_HTML>
COLUMNA = "TEMP_HTML"
LINK = "<% ENTRADA_1:Link %>"
</DESCARGAR_HTML>

Pagina 52

Manual CSV Robot v1.0 - Rev A

; Extraer el nombre del producto del


; html descargado
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "Nombre"
TAG_INICIO = "<div class=\"product-name\""
TAG_FINAL = "</div>"
</EXTRAER_TEXTO_DESDE_TEXTO>
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA: Nombre %>"
COLUMNA = "Nombre"
TAG_INICIO = ">"
TAG_FINAL = "</h1>"
</EXTRAER_TEXTO_DESDE_TEXTO>
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA: Nombre %>"
COLUMNA = "Nombre"
TAG_INICIO = ">"
TAG_FINAL = ""
</EXTRAER_TEXTO_DESDE_TEXTO>
; Extraer el Precio del producto del html
; descargado a la columna "Precio"
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "Precio"
TAG_INICIO = "<span class=\"price\">"
TAG_FINAL = "</span>"
</EXTRAER_TEXTO_DESDE_TEXTO>
; Extraer descripcion del producto del html
; descargado a la columna "TEMP_DESCRIPCION"
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "TEMP_DESCRIPCION"
TAG_INICIO = "<table border=\"1\""
TAG_FINAL = "</table>"
INCLUIR_TAGS = "1"
</EXTRAER_TEXTO_DESDE_TEXTO>
; Crear directorio y nombrarlo con el valor de
; la columna ID de ENTRADA_1
; -------------------------------------<CREAR_DIRECTORIO>

Pagina 53

Manual CSV Robot v1.0 - Rev A

NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"


</CREAR_DIRECTORIO>
<CREAR_ARCHIVO>
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
NOMBRE_ARCHIVO = "Descripcion.html"
CONTENIDO_ARCHIVO = "<%
SALIDA:TEMP_DESCRIPCION %>"
</ CREAR_ARCHIVO >
; Eliminar columna TEMP_HTML
; -------------------------------------<QUITAR_COLUMNA>
COLUMNA = "TEMP_HTML"
</QUITAR_COLUMNA >
; Eliminar columna TEMP_DESCRIPCION
; -------------------------------------<QUITAR_COLUMNA>
COLUMNA = "TEMP_DESCRIPCION"
</QUITAR_COLUMNA >
</PROCESOS>
</ROOT>

Pagina 54

Manual CSV Robot v1.0 - Rev A

5.4 Proceso DESCARGAR_ARCHIVO


Este proceso permite descargar un archivo al disco desde una direccin proporcionada
como parmetro.
Los parmetros requeridos por este proceso son:
NOMBRE_DIRECTORIO = DDD - Obligatorio, es el directorio en el cual se
guardar el archivo descargado. Si se especifica como valor del parmetro, el archivo
se creara en el mismo directorio del script.
NOMBRE_ARCHIVO = AAA - Obligatorio, indica el nombre que se le asignar al
archivo descargado. Si se proporciona como valor, el archivo se guardar con su
nombre original
LINK = LLL - Obligatorio, indica el link del cual descargar el archivo
5.4.1 Ejemplo 9 Descarga de archivos
Este ejemplo es una continuacin del ejemplo 8. Vamos a ampliar el ejemplo, ahora
descargando la imagen principal de cada producto desde la pgina web
Primero veamos como descargamos la imagen.
Si entramos a alguno de los productos de la pgina (emplearemos la misma direccin de
ejemplo que hemos empleado hasta el momento):
http://www.e-crazydeals.com/store/index.php/ramos-w19-v2-0-tablet-pc-android-4-0-3cortex-a9-dual-camera-8gb.html
Y empleamos la funcin Inspeccionar Elemento de google chrome para ver la
estructura de la pgina, podemos observar que la imagen del producto esta definida:
<p class="product-image product-image-zoom">
<img id="image" src="http://www.ecrazydeals.com/store/media/catalog/product/cache/1/image/9df78eab33525d08d6e5fb8
d27136e95/6/_/6_26.jpg" alt="Ramos W19 V2.0 Tablet PC Android 4.0.3 Cortex A9
Dual Camera 8GB" title="Ramos W19 V2.0 Tablet PC Android 4.0.3 Cortex A9 Dual
Camera 8GB" style="width: 265px; left: 0px; top: 32.5px; "></p>
La parte en rojo es la que nos interesa extraer, y la parte en azul son los elementos que
nos permiten identificar la seccin de texto como nica dentro de toda la pgina.
El proceso de extraccin para esta imagen se hace en dos partes, la primera de ellas:
<EXTRAER_TEXTO_DESDE_TEXTO>
(1)
TEXTO = "<% SALIDA:TEMP_HTML %>"
(2)
COLUMNA = "TEMP_IMAGEN"
(3)
TAG_INICIO = "<p class=\"product-image"
(4)
TAG_FINAL = "</p>"
</EXTRAER_TEXTO_DESDE_TEXTO>
Aqu estamos definiendo:
1- El texto a procesar se encuentra en la columna TEMP_HTML del registro
SALIDA (ver ejemplo 6).

Pagina 55

Manual CSV Robot v1.0 - Rev A

2 El resultado de la extraccin se almacenar en una columna temporal


TEMP_IMAGEN del registro SALIDA. Se emplea una columna temporal porque
necesitamos un almacenamiento para el link, y luego emplearemos el link para
descargar el archivo. Esta columna se eliminar antes de terminar el script
3 y 4 El texto a extraer es el que se encuentra entre <p class="product-image y </p>
aqu tambin aplica la necesidad de anteponer \ a todas las comillas dobles que
forman parte del valor del parmetro TAG_.
Sobre esta primera extraccin se realiza una segunda:
<EXTRAER_TEXTO_DESDE_TEXTO>
(1)
TEXTO = "<% SALIDA:TEMP_IMAGEN %>"
(2)
COLUMNA = "TEMP_IMAGEN"
(3)
TAG_INICIO = "http://www"
(4)
TAG_FINAL = ".jpg "
(5)
INCLUIR_TAGS = "1"
</EXTRAER_TEXTO_DESDE_TEXTO>
Aqu estamos definiendo:
1- El texto a procesar se encuentra en la columna TEMP_IMAGEN del registro
SALIDA.
2 El resultado de la extraccin se almacenar en la misma columna TEMP_IMAGEN.
3 y 4 El texto a extraer es el que se encuentra entre http://www y .jpg.
5 Como el resultado es un link y necesitamos que este completo, incluimos los
delimitadores que se emplearon para ubicarlo, empleando el parmetro
INCLUIR_TAGS=1
Luego de ejecutar estos dos procesos, ya disponemos del link de la imagen principal del
producto en la columna TEMP_IMAGEN. Ahora descargamos el archivo empleando el
link obtenido:
<DESCARGAR_ARCHIVO>
(1)
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
(2)
NOMBRE_ARCHIVO = "Img_principal.jpg"
(3)
LINK = "<% SALIDA:TEMP_IMAGEN %>"
</ DESCARGAR_ARCHIVO >
Aqu estamos definiendo:
1- El nombre del directorio en el cual se descargar el archivo esta en la columna ID del
registro ENTRADA_1 (Recordemos que el proceso CREAR_DIRECTORIO cre un
directorio previamente con ese nombre, por lo que se va a crear para cada producto, un
directorio propio, y dentro de ese directorio, un archivo.
2 El nombre del archivo que se va a crear dentro del directorio del producto siempre
es Img_principal.jpg. Si proporcionramos como parmetro
NOMBRE_ARCHIVO=, el archivo se descargara con su nombre original.
3 El link del archivo a descargar esta en TEMP_IMAGEN del registro SALIDA
Al ejecutar este proceso, obtenemos un archivo Img_principal.jpg creado en el
directorio con nombre del ID de cada producto.

Pagina 56

Manual CSV Robot v1.0 - Rev A

Finalmente, no hay que olvidar eliminar la columna TEMP_IMAGEN antes de terminar


el script
<QUITAR_COLUMNA>
COLUMNA = "TEMP_IMAGEN"
</QUITAR_COLUMNA >
Esta es la transcripcin completa del script del ejemplo 9. Se han resaltado con color los
procesos aadidos para este ejemplo:
<ROOT>
; Parametros de Configuracion
; --------------------------------------------------------------<CONFIG>
ARCHIVO_ENTRADA_1 = "Links.txt"
ARCHIVO_SALIDA = "Salida.txt"
</CONFIG>
; LISTA DE PROCESOS
; --------------------------------------------------------------<PROCESOS>
;Copiar columna ID desde ENTRADA_1 a SALIDA
; -------------------------------------<SETEAR_VALOR_COLUMNA>
COLUMNA = "ID"
VALOR = "<% ENTRADA_1:ID %>"
</SETEAR_VALOR_COLUMNA>
; Descargar HTML empleando como link la columna
; Link de ENTRADA_1
; El HTML descargado se almacena en la columna
; TEMP_HTML de SALIDA
; -------------------------------------<DESCARGAR_HTML>
COLUMNA = "TEMP_HTML"
LINK = "<% ENTRADA_1:Link %>"
</DESCARGAR_HTML>
; Extraer el nombre del producto del
; html descargado
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "Nombre"
TAG_INICIO = "<div class=\"product-name\""
TAG_FINAL = "</div>"
</EXTRAER_TEXTO_DESDE_TEXTO>
<EXTRAER_TEXTO_DESDE_TEXTO>

Pagina 57

Manual CSV Robot v1.0 - Rev A

TEXTO = "<% SALIDA: Nombre %>"


COLUMNA = "Nombre"
TAG_INICIO = ">"
TAG_FINAL = "</h1>"
</EXTRAER_TEXTO_DESDE_TEXTO>
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA: Nombre %>"
COLUMNA = "Nombre"
TAG_INICIO = ">"
TAG_FINAL = ""
</EXTRAER_TEXTO_DESDE_TEXTO>
; Extraer el Precio del producto del html
; descargado a la columna "Precio"
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "Precio"
TAG_INICIO = "<span class=\"price\">"
TAG_FINAL = "</span>"
</EXTRAER_TEXTO_DESDE_TEXTO>
; Extraer descripcion del producto del html
; descargado a la columna "TEMP_DESCRIPCION"
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "TEMP_DESCRIPCION"
TAG_INICIO = "<table border=\"1\""
TAG_FINAL = "</table>"
INCLUIR_TAGS = "1"
</EXTRAER_TEXTO_DESDE_TEXTO>
; Extraer link de la imagen principal
; del producto a la columna "TEMP_IMAGEN"
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "TEMP_IMAGEN"
TAG_INICIO = "<p class=\"product-image"
TAG_FINAL = "</p>"
</EXTRAER_TEXTO_DESDE_TEXTO>
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_IMAGEN %>"
COLUMNA = "TEMP_IMAGEN"
TAG_INICIO = "http://www"
TAG_FINAL = ".jpg "
INCLUIR_TAGS = "1"

Pagina 58

Manual CSV Robot v1.0 - Rev A

</EXTRAER_TEXTO_DESDE_TEXTO>
; Crear directorio y nombrarlo con el valor de
; la columna ID de ENTRADA_1
; -------------------------------------<CREAR_DIRECTORIO>
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
</CREAR_DIRECTORIO>
; Crear archivo con Descripcion.html, con el
; contenido de la columna TEMP_DESCRIPCION,
; en el directorio creado previamente
; -------------------------------------<CREAR_ARCHIVO>
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
NOMBRE_ARCHIVO = "Descripcion.html"
CONTENIDO_ARCHIVO = "<%
SALIDA:TEMP_DESCRIPCION %>"
</ CREAR_ARCHIVO >
; Descargar archivo desde el link indicado en
; TEMP_IMAGEN, guardarlo en el directorio creado
; previamente, y con nombre Img_principal.jpg
; -------------------------------------<DESCARGAR_ARCHIVO>
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
NOMBRE_ARCHIVO = "Img_principal.jpg"
LINK = "<% SALIDA:TEMP_IMAGEN %>"
</ DESCARGAR_ARCHIVO >
; Eliminar columna TEMP_HTML
; -------------------------------------<QUITAR_COLUMNA>
COLUMNA = "TEMP_HTML"
</QUITAR_COLUMNA >
; Eliminar columna TEMP_DESCRIPCION
; -------------------------------------<QUITAR_COLUMNA>
COLUMNA = "TEMP_DESCRIPCION"
</QUITAR_COLUMNA >
; Eliminar columna TEMP_IMAGEN
; -------------------------------------<QUITAR_COLUMNA>
COLUMNA = "TEMP_IMAGEN"
</QUITAR_COLUMNA >
</PROCESOS>
</ROOT>

Pagina 59

Manual CSV Robot v1.0 - Rev A

6. Procesos Avanzados
6.1 Proceso EXTRAER_ARRAY_DESDE_TEXTO
Seguramente, al conocer el proceso EXTRAER_TEXTO_DESDE_TEXTO, se habr
preguntado: por que ese nombre? Por que no llamarlo simplemente
EXTRAER_TEXTO, que refleja perfectamente la funcin que realiza? A partir de esta
seccin, se responde a esa pregunta. El proceso que veremos a continuacin es una
variante de EXTRAER_TEXTO. Empezaremos por examinar la necesidad, y que es lo
que se puede y no se puede hacer con un proceso de extraccin simple de texto para ver
como podemos solucionarlo:
En el ultimo ejemplo (Ejemplo 9) se emple el proceso EXTRAER_TEXTO para
obtener el link de la imagen del producto del cual se desea extraer informacin de
inters, y luego, el proceso DESCARGAR_ARCHIVO, para descargar esa imagen a
disco. La pregunta que luego surge naturalmente es: Y si deseo descargar todas las
imgenes del producto?
Obviamente, para descargar las imgenes, necesitaremos los links de las mismas. Si
accedemos al link del producto que hemos estado empleando como ejemplo hasta ahora:
http://www.e-crazydeals.com/store/index.php/ramos-w19-v2-0-tablet-pc-android-4-0-3cortex-a9-dual-camera-8gb.html
Y analizamos la estructura de la pgina, veremos, por ejemplo, el html de la primera
imagen:
<li sourceindex="166">
<a href="#" onclick="popWin('http://www.ecrazydeals.com/store/index.php/catalog/product/gallery/id/33/image/263/', 'gallery',
'width=300,height=300,left=0,top=0,location=no,status=yes,scrollbars=yes,resizable=ye
s'); return false;" title="" sourceindex="167"><img src="http://www.ecrazydeals.com/store/media/catalog/product/cache/1/thumbnail/56x/9df78eab33525d08
d6e5fb8d27136e95/1/_/1_28.jpg" width="56" height="56" alt=""
sourceindex="168"></a>
</li>
Y el de la tercera imagen:
<li sourceindex="172">
<a href="#" onclick="popWin('http://www.ecrazydeals.com/store/index.php/catalog/product/gallery/id/33/image/265/', 'gallery',
'width=300,height=300,left=0,top=0,location=no,status=yes,scrollbars=yes,resizable=ye
s'); return false;" title="" sourceindex="173"
siber__q92dpb7seovvtbh5__vptr="6bfab60"><img src="http://www.ecrazydeals.com/store/media/catalog/product/cache/1/thumbnail/56x/9df78eab33525d08
d6e5fb8d27136e95/6/_/6_26.jpg" width="56" height="56" alt="" sourceindex="174"
siber__q92dpb7seovvtbh5__vptr="6bfac50"></a>
</li>

Pagina 60

Manual CSV Robot v1.0 - Rev A

El comportamiento de esta web es muy particular, y sirve muy bien de ejemplo para ver
los desafos con los que nos podemos encontrar cuando estamos escribiendo un script de
web scraping para CSV Robot.
Los fragmentos de HTML extrados de la pgina, poseen dos urls, la primera se resalto
en rojo y la segunda en azul. La segunda direccin apunta a una imagen, pero no es la
que estamos buscando, ya que si copiamos la direccin y la pegamos en el navegador,
accedemos a una imagen muy pequea del producto (una miniatura o thumbnail) que es
la que se emplea para armar la pagina y agilizar la carga. Cuando el usuario hace click
en la imagen en miniatura, un fragmento de cdigo javascript incrustado en el html
(onclick="popWin) abre una ventana en forma de popup, con la direccin url
resaltada en rojo. Dentro de esa nueva ventana si se encuentra la imagen que estamos
buscando.
Lo que vamos a hacer es hacer click en la imagen, para que se abra la nueva ventana, y
copiamos el html de la imagen que nos interesa.
Comparamos:
El fragmento HTML de la pagina del producto:
<li sourceindex="166">
<a href="#" onclick="popWin('http://www.ecrazydeals.com/store/index.php/catalog/product/gallery/id/33/image/263/', 'gallery',
'width=300,height=300,left=0,top=0,location=no,status=yes,scrollbars=yes,resizable=ye
s'); return false;" title="" sourceindex="167"><img src="http://www.ecrazydeals.com/store/media/catalog/product/cache/1/thumbnail/56x/9df78eab33525d08
d6e5fb8d27136e95/1/_/1_28.jpg" width="56" height="56" alt=""
sourceindex="168"></a>
</li>
Y un fragmento del HTML de imagen que nos interesa en la pgina que se despliega
como popup al hacer click en la miniatura:

<img src="http://www.ecrazydeals.com/store/media/catalog/product/cache/1/image/9df78eab33525d08d6e5fb8
d27136e95/1/_/1_28.jpg" width="500" alt="" title="" id="product-gallery-image"
class="image" sourceindex="41" siber__q92dpb7seovvtbh5__vptr="60be9c0">
.
Muy interesante!!!!, entre el link de la imagen en miniatura, y la imagen real que nos
interesa, solo cambia el fragmento resaltado en color rojo!!!!.
Obviamente, antes de apresurarnos, verificamos que suceda lo mismo con distintos
productos, y descubrimos que si, ocurre lo mismo.
Nota: Esta es la mayor complicacin del web scraping. CSV Robot proporciona
herramientas muy sencillas y potentes para extraer la informacin que nos interesa,
pero es tarea del usuario, analizar la estructura de la pgina para determinar donde
se encuentra la informacin que se necesita y como extraerla. Los ejemplos de web
scraping que se presentan en este manual son orientativos, a modo de presentar el
anlisis necesario para determinar como escribir el script de CSV Robot.

Pagina 61

Manual CSV Robot v1.0 - Rev A

Quiere decir que afortunadamente, podemos obtener el link real de la imagen que nos
interesa extraer, a partir del link de su miniatura. Como lo haramos?
Podemos emplear como parmetros delimitadores del proceso EXTRAER_TEXTO:
<img src="http://www.ecrazydeals.com/store/media/catalog/product/cache/1/thumbnail/56x/9df78eab33525
d08d6e5fb8d27136e95/6/_/6_26.jpg" width="56" height="56" alt=""
sourceindex="174" siber__q92dpb7seovvtbh5__vptr="6bfac50">
Eso nos permitira obtener el link de la miniatura (deberemos emplear tambin el
parmetro INCLUIR_TAGS, para no destruir el link en el proceso de extraccin), y
luego, aplicando Reemplazo de texto, reemplazamos la parte thumbnail/56x por
image, y obtenemos el link de la imagen real, que empleamos para descargarla al
disco.
Parece lgico, pero hay 2 problemas con todo esto:
1 El patrn de texto html que deseamos extraer se repite por cada imagen miniatura
que posee el producto, y el proceso EXTRAER_TEXTO_DESDE_TEXTO, recupera
solo la primera aparicin, e ignora las siguientes
2 No todos los productos poseen la misma cantidad de imgenes
Aqu es donde aparece una nueva familia de procesos disponibles en CSV Robot. Todos
se caracterizan por incluir en su nombre la palabra ARRAY
6.1.1 Que es un ARRAY?
Array, es un conjunto de valores del mismo tipo. Es un termino muy empleado en
lenguajes de programacin. Un array agrupa valores, por ejemplo, nombres de personas.
Jose,Luis,Pedro son valores, y pueden agruparse en un array de nombres.
6.1.2 Como se emplean los ARRAYS en CSV Robot?
Como sabemos, en un registro, ya sea uno de los registros de entrada, o el registro de
salida, se encuentran definidas columnas, o campos, y en cada columna se almacena un
nico valor. Con esta regla en mente, tratemos de imaginar como podramos extraer
links de imgenes y guardarlos en columnas de los registros.
Podramos en el script crear una columna para cada link a extraer:
Producto,Link,Imagen1,Imagen2,Imagen3
Tablet NN,www,1.jpg,2.jpg,3.jpg
El problema, que ya se comento, es que los productos no poseen la misma cantidad de
imgenes. Otra regla general de los archivos CSV, es que todos los registros del archivo
deben contener el mismo numero de columnas, entonces, como extraemos una cantidad
variable de datos (en este caso links de imgenes a descargar) y la almacenamos en un
registro, sin violar esta regla fundamental?
Para lograr esto, CSV Robot define el termino Array como un conjunto de valores que
se encuentran almacenados en una sola columna.
Para almacenar un conjunto de valores en un espacio nico, CSV Robot emplea el
carcter , como delimitador de valores.

Pagina 62

Manual CSV Robot v1.0 - Rev A

La informacin que queremos extraer, entonces se podra almacenar de la siguiente


manera:
Producto,Link,Imagenes
Tablet NN,www,1.jpg,2.jpg,3.jpg
Obsrvese que ahora, todos los links de las imgenes se almacenan en una nica
columna, Ahora es indistinto que el producto posea 1 o 10 imgenes, todos los links se
almacenan en un nico campo.
De esto mismo se explica porque surge la necesidad de una nueva familia de procesos.
Los procesos que hemos visto hasta ahora consideran que al tomar un valor de una
columna de un registro, realizar un procesamiento y escribir un resultado en otra
columna, estn trabajando sobre valores nicos en indivisibles.
Por ello necesitamos una familia de procesos que sepan de antemano que los valores
con los que trabajaran son valores contenidos dentro de una nica columna, pero que se
debe tratar como un conjunto de valores independientes para su procesamiento.
6.1.3 Volviendo a la extraccin
El proceso EXTRAER_ARRAY_DESDE_TEXTO, es idntico al proceso
EXTRAER_TEXTO_DESDE_TEXTO, y posee los mismos parmetros. Si los
recordamos, los parmetros requeridos por este proceso son:
TEXTO = TEXTO FUENTE - Obligatorio, es el texto a procesar. Se puede indicar un
texto fijo, o empleando direccionamiento de campos, procesar el contenido de una
columna del registro ENTRADA_1, ENTRADA_2 o SALIDA.
COLUMNA = "CCC" - Obligatorio, indica el nombre de la columna del REGISTRO
DE SALIDA en la cual se colocar el texto extrado. Si la columna no existe, se crea
para almacenar el valor.
TAG_INICIO = "AAA" - Obligatorio, indica el Delimitador inicial a partir del cual
extraer el texto de inters. Si se especifica TAG_INICIO = , se extrae desde el
comienzo de TEXTO_FUENTE
TAG_FINAL = "BBB" - Obligatorio, indica el delimitador final hasta el cual extraer el
texto de inters. Si se especifica TAG_FINAL = , se extrae hasta el final de
TEXTO_FUENTE
INCLUIR_TAGS = 1 - Opcional, si se incluye, su valor debe ser 1. Si este
parmetro se incluye, al resultado extrado, se le aaden TAG_INICIO y TAG_FINAL
antes de guardar en la columna destino.
Lo nico que cambia en el proceso EXTRAER_ARRAY_DESDE_TEXTO, es que al
realizar la extraccin, asume que se pretende extraer no un valor nico (La primera
coincidencia que encuentra en el caso de EXTRAER_TEXTO_DESDE_TEXTO), sino
un array de valores, entonces, realiza la bsqueda de coincidencias con los TAGS
indicados como parmetros, y cada coincidencia encontrada se aade al array de
resultados, que luego se almacena en la columna destino.
Nota Importante: El proceso EXTRAER_ARRAY_DESDE_TEXTO, como su nombre
lo indica, recibe como entrada un TEXTO simple, y los parmetros del proceso, y
produce en su salida un array de valores. Dicho array de valores esta formado por
todas las coincidencias de fragmentos de texto encerrados entre los parmetros
TAG_INICIO y TAG_FINAL. El proceso toma todas las coincidencias encontradas, y

Pagina 63

Manual CSV Robot v1.0 - Rev A

construye un array (colocando todos los valores encontrados, y separndolos por ,).
Obsrvese que si el proceso EXTRAER_ARRAY_DESDE_TEXTO encuentra una
nica coincidencia de texto a extraer entre los tags proporcionados, el resultado
generado, al ser un array de un nico elemento, es idntico al resultado que se habra
obtenido de aplicar el proceso EXTRAER_TEXTO_DESDE_TEXTO.
Veamos un ejemplo
Supongamos que poseemos el siguiente texto en la columna TEMP del registro de
salida:
<p>Este es el prrafo 1</p><p>Este es el prrafo 2</p><p>Este es el prrafo 3</p>
Es algo muy comn en documentos HTML.
Supongamos que aplicamos el proceso EXTRAER_TEXTO_DESDE_TEXTO para
recuperar el fragmento contenido entre <p> y </p> y colocarlo en la columna
PARRAFOS del registro de salida
El proceso sera el siguiente:
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP %>"
COLUMNA = "PARRAFOS"
TAG_INICIO = "<p>"
TAG_FINAL = "</p"
</EXTRAER_TEXTO_DESDE_TEXTO>
Como EXTRAER_TEXTO_DESDE_TEXTO extrae solamente la primera coincidencia
contenida entre los TAGS proporcionados, luego de ejecutar, la columna PARRAFOS
contendr:
Este es el prrafo 1
Si ahora en cambio empleamos el proceso EXTRAER_ARRAY_DESDE_TEXTO, con
los mismos parmetros a CSV Robot, le estamos indicando que ahora no queremos
extraer un nico valor, sino un conjunto de todos los valores que encuentre delimitados
entre los TAGS proporcionados como parmetros:
<EXTRAER_ARRAY_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP %>"
COLUMNA = "PARRAFOS"
TAG_INICIO = "<p>"
TAG_FINAL = "</p"
</EXTRAER_ARRAY_DESDE_TEXTO>
El resultado obtenido en la columna PARRAFOS ser:
Este es el prrafo 1,Este es el prrafo 2,Este es el prrafo 3

Pagina 64

Manual CSV Robot v1.0 - Rev A

Nota Importante: Como los procesos que trabajan con Arrays emplean el carcter ,
como delimitador para separar los valores de cada elemento del array, se aplican
automticamente todas las reglas vistas de comillas dobles para evitar problemas con
los archivos CSV Generados. En el ejemplo, si el archivo CSV de SALIDA emplea
como delimitador el carcter , entonces la columna PARRAFOS ser escrita en
dicho archivo encerrada entre comillas dobles, para que los delimitadores internos
del array no se confundan con los delimitadores del archivo CSV.
6.1.4 Ejemplo 10 Extraer Array de links
Vamos a continuar con el ejemplo 9 acercndonos en cada paso a una aplicacin real y
compleja de web scraping y procesamiento CSV. Sobre los ejemplos vistos hasta el
momento, aadiremos la extraccin de los links de las imgenes del producto, y a
dichos links, que como se saben corresponden a las imgenes en miniatura, les
aplicaremos un proceso de reemplazo de texto para obtener los links de las imgenes
reales.
El proceso de extraccin de los links lo aplicamos luego de la extraccin de la imagen
principal que realizamos en el ejemplo 9
<EXTRAER_ARRAY_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "TEMP_IMAGENES"
TAG_INICIO = "http://www.ecrazydeals.com/store/media/catalog/product/cache/"
TAG_FINAL = ".jpg"
INCLUIR_TAGS = "1"
</EXTRAER_ARRAY_DESDE_TEXTO>
Ntese que aprovechamos que la URL de las imgenes comienza siempre de la misma
manera para emplearla como delimitador para la bsqueda y extraccin. De igual
manera, como necesitamos dicha URL completa, agregamos la opcin
INCLUIR_TAGS, para que los mismos delimitadores empleados formen parte de los
valores extrados.
Y luego, sobre los URLs extrados aplicamos el reemplazo de texto con repeticin
<REEMPLAZAR_TEXTO_EN_TEXTO>
TEXTO = "<% SALIDA:TEMP_IMAGENES %>"
COLUMNA = "TEMP_IMAGENES"
BUSCAR = "thumbnail/56x"
REEMPLAZAR = "image"
REPETIR = "100"
</REEMPLAZAR_TEXTO_EN_TEXTO>
Este ejemplo lo terminamos en este paso, para que se pueda observar, en el archivo
CSV de salida el array de links generado. En ejemplos posteriores emplearemos ese
array de links para descargar las imgenes, y luego eliminaremos la columna
TEMP_IMAGENES, para que no aparezca en el archivo de salida.

Pagina 65

Manual CSV Robot v1.0 - Rev A

Esta es la transcripcin completa del script del ejemplo 10. Se han resaltado con color
los procesos aadidos para este ejemplo:

<ROOT>
; Parametros de Configuracion
; --------------------------------------------------------------<CONFIG>
ARCHIVO_ENTRADA_1 = "Links.txt"
ARCHIVO_SALIDA = "Salida.txt"
</CONFIG>
; LISTA DE PROCESOS
; --------------------------------------------------------------<PROCESOS>
;Copiar columna ID desde ENTRADA_1 a SALIDA
; -------------------------------------<SETEAR_VALOR_COLUMNA>
COLUMNA = "ID"
VALOR = "<% ENTRADA_1:ID %>"
</SETEAR_VALOR_COLUMNA>
; Descargar HTML empleando como link la columna
; Link de ENTRADA_1
; El HTML descargado se almacena en la columna
; TEMP_HTML de SALIDA
; -------------------------------------<DESCARGAR_HTML>
COLUMNA = "TEMP_HTML"
LINK = "<% ENTRADA_1:Link %>"
</DESCARGAR_HTML>
; Extraer el nombre del producto del
; html descargado
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "Nombre"
TAG_INICIO = "<div class=\"product-name\""
TAG_FINAL = "</div>"
</EXTRAER_TEXTO_DESDE_TEXTO>
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA: Nombre %>"
COLUMNA = "Nombre"
TAG_INICIO = ">"
TAG_FINAL = "</h1>"
</EXTRAER_TEXTO_DESDE_TEXTO>

Pagina 66

Manual CSV Robot v1.0 - Rev A

<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA: Nombre %>"
COLUMNA = "Nombre"
TAG_INICIO = ">"
TAG_FINAL = ""
</EXTRAER_TEXTO_DESDE_TEXTO>
; Extraer el Precio del producto del html
; descargado a la columna "Precio"
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "Precio"
TAG_INICIO = "<span class=\"price\">"
TAG_FINAL = "</span>"
</EXTRAER_TEXTO_DESDE_TEXTO>
; Extraer descripcion del producto del html
; descargado a la columna "TEMP_DESCRIPCION"
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "TEMP_DESCRIPCION"
TAG_INICIO = "<table border=\"1\""
TAG_FINAL = "</table>"
INCLUIR_TAGS = "1"
</EXTRAER_TEXTO_DESDE_TEXTO>
; Extraer link de la imagen principal
; del producto a la columna "TEMP_IMAGEN"
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "TEMP_IMAGEN"
TAG_INICIO = "<p class=\"product-image"
TAG_FINAL = "</p>"
</EXTRAER_TEXTO_DESDE_TEXTO>
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_IMAGEN %>"
COLUMNA = "TEMP_IMAGEN"
TAG_INICIO = "http://www"
TAG_FINAL = ".jpg "
INCLUIR_TAGS = "1"
</EXTRAER_TEXTO_DESDE_TEXTO>
; Extraer array de links de las imagenes en miniatura
; del producto a la columna "TEMP_IMAGENES"
; -------------------------------------<EXTRAER_ARRAY_DESDE_TEXTO>

Pagina 67

Manual CSV Robot v1.0 - Rev A

TEXTO = "<% SALIDA:TEMP_HTML %>"


COLUMNA = "TEMP_IMAGENES"
TAG_INICIO = "http://www.ecrazydeals.com/store/media/catalog/product/cache/"
TAG_FINAL = ".jpg"
INCLUIR_TAGS="1"
</EXTRAER_ARRAY_DESDE_TEXTO>
; En el array de links extraido, reemplazar "thumbnail/56x"
; por "image" en todos los links, para obtener los links
; de las imagenes a tamao real
; -------------------------------------<REEMPLAZAR_TEXTO_EN_TEXTO>
TEXTO = "<% SALIDA:TEMP_IMAGENES %>"
COLUMNA = "TEMP_IMAGENES"
BUSCAR = "thumbnail/56x"
REEMPLAZAR = "image"
REPETIR = "100"
</REEMPLAZAR_TEXTO_EN_TEXTO>
; Crear directorio y nombrarlo con el valor de
; la columna ID de ENTRADA_1
; -------------------------------------<CREAR_DIRECTORIO>
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
</CREAR_DIRECTORIO>
; Crear archivo con Descripcion.html, con el
; contenido de la columna TEMP_DESCRIPCION,
; en el directorio creado previamente
; -------------------------------------<CREAR_ARCHIVO>
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
NOMBRE_ARCHIVO = "Descripcion.html"
CONTENIDO_ARCHIVO = "<%
SALIDA:TEMP_DESCRIPCION %>"
</ CREAR_ARCHIVO >
; Descargar archivo desde el link indicado en
; TEMP_IMAGEN, guardarlo en el directorio creado
; previamente, y con nombre Img_principal.jpg
; -------------------------------------<DESCARGAR_ARCHIVO>
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
NOMBRE_ARCHIVO = "Img_principal.jpg"
LINK = "<% SALIDA:TEMP_IMAGEN %>"
</ DESCARGAR_ARCHIVO >
; Eliminar columna TEMP_HTML
; --------------------------------------

Pagina 68

Manual CSV Robot v1.0 - Rev A

<QUITAR_COLUMNA>
COLUMNA = "TEMP_HTML"
</QUITAR_COLUMNA >
; Eliminar columna TEMP_DESCRIPCION
; -------------------------------------<QUITAR_COLUMNA>
COLUMNA = "TEMP_DESCRIPCION"
</QUITAR_COLUMNA >
; Eliminar columna TEMP_IMAGEN
; -------------------------------------<QUITAR_COLUMNA>
COLUMNA = "TEMP_IMAGEN"
</QUITAR_COLUMNA >
</PROCESOS>
</ROOT>

Pagina 69

Manual CSV Robot v1.0 - Rev A

6.2 Proceso EXTRAER_ARRAY_DESDE_ARRAY


Este proceso es muy sencillo de entender ahora que hemos visto para que emplea CSV
Robot los arrays de valores.
Como de aprendi hasta el momento, el proceso
EXTRAER_TEXTO_DESDE_TEXTO, produce una transformacin en un texto de
entrada, generando un texto de salida (El texto contenido entre los tags indicados). Por
su parte, el proceso EXTRAER_ARRAY_DESDE_TEXTO, produce una
transformacin, generando a partir de un texto de entrada, un array de valores (todas las
coincidencias delimitadas entre los tags delimitadores) como salida.
Finalmente, ahora presentaremos la tercera variante del proceso EXTRAER_TEXTO.
Esta variante es EXTRAER_ARRAR_DESDE_ARRAY, y lo que hace es tomar como
entrada un array y generar como salida otro array.
En el ejemplo 10 se evalu como extraer de la pgina html del producto de inters, un
array con los links de las imgenes que necesitbamos. La operacin fue relativamente
sencilla, pero si tuviramos que procesar el array obtenido para extraer de cada
elemento un nuevo elemento resultante de salida, esto significara tomar un array,
procesarlo y seguir obteniendo un array como resultado.
Vemoslo con un ejemplo:
Volvamos al html del producto, a la parte de las imgenes:
<div class="more-views" sourceindex="163">
<h2 sourceindex="164">More Views</h2>
<ul sourceindex="165">
<li sourceindex="166">..</li>
<li sourceindex="169">..</li>
<li sourceindex="172">..</li>
<li sourceindex="175">..</li>
<li sourceindex="178">..</li>
<li sourceindex="181">..</li>
<li sourceindex="184">..</li>
<li sourceindex="187">..</li>
<li sourceindex="190">..</li>
<li sourceindex="193">..</li>
<li sourceindex="196">..</li>
<li sourceindex="199">..</li>
<li sourceindex="202">..</li>
</ul>
</div>
Cada etiqueta HTML <li sourceindex="nnn">..</li> contiene en su interior es cdigo
que se vio en el ejemplo anterior:
<li sourceindex="166">
<a href="#" onclick="popWin('http://www.ecrazydeals.com/store/index.php/catalog/product/gallery/id/48/image/410/', 'gallery',
'width=300,height=300,left=0,top=0,location=no,status=yes,scrollbars=yes,resizable=ye
s'); return false;" title="" sourceindex="167"
siber__q92dpb7seovvtbh5__vptr="6bfcfc0"><img src="http://www.e-

Pagina 70

Manual CSV Robot v1.0 - Rev A

crazydeals.com/store/media/catalog/product/cache/1/thumbnail/56x/9df78eab33525
d08d6e5fb8d27136e95/1/_/1_43.jpg" width="56" height="56" alt=""
sourceindex="168" siber__q92dpb7seovvtbh5__vptr="6bfa870"></a>
</li>
De donde se puede extraer el link de la imagen.
Vamos a repetir el ejemplo 10, pero obtendremos los datos de otra manera.
6.2.1 Ejemplo 11 Extraer Array desde Array
Emplearemos el mtodo que se ha recomendado a lo largo de todo este manual para lo
que es extraccin de informacin desde HTML, que consiste en identificar los bloques
fundamentales, y a partir de ah, realizar sucesivos procesos de extraccin hasta obtener
la informacin deseada. Los pasos sern los siguientes:
1 Descarga del HTML del producto (de ejemplos anteriores)
2 Extraccin de precio, nombre, etc. (ejemplos anteriores)
3 Se extrae el DIV de las imgenes del producto:
Para ello, se aplica un proceso EXTRAER_TEXTO_DESDE_TEXTO que recupere el
texto contenido entre <div class="more-views" y </div>.
4 Sobre el HTML obtenido se aplica un proceso
EXTRAER_ARRAY_DESDE_TEXTO, que recupere todos los elementos contenidos
entre <li y </li>. De este proceso se obtiene un array con todos los elementos li que
estaban contenidos en el elemento DIV.
5 Sobre el array obtenido del ejemplo anterior, se aplica el proceso
EXTRAER_ARRAY_DESDE_ARRAY, que procese cada elemento del array, obtenga
el contenido delimitado entre <img src=" y " (comillas dobles), y con los resultados
forme un nuevo array. Este array ya contiene los links de las miniaturas de las imgenes
del producto.
6 Aplicar un proceso de REEMPLAZO DE TEXTO para convertir dichos links en los
links de las imgenes de tamao real.
Si bien es un proceso mas largo, es mucho mas estructurado, porque se obtienen
elementos html y luego se busca y se extraen otros elementos html del interior, con lo
que el proceso se hace mas largo, pero a la vez mas mecnico y fcil de comprender.
Esta es la transcripcin completa del script del ejemplo 11. Se han resaltado con color
los procesos aadidos para este ejemplo:
<ROOT>
; Parametros de Configuracion
; --------------------------------------------------------------<CONFIG>
ARCHIVO_ENTRADA_1 = "Links.txt"
ARCHIVO_SALIDA = "Salida.txt"
</CONFIG>
; LISTA DE PROCESOS
; --------------------------------------------------------------<PROCESOS>

Pagina 71

Manual CSV Robot v1.0 - Rev A

;Copiar columna ID desde ENTRADA_1 a SALIDA


; -------------------------------------<SETEAR_VALOR_COLUMNA>
COLUMNA = "ID"
VALOR = "<% ENTRADA_1:ID %>"
</SETEAR_VALOR_COLUMNA>
; Descargar HTML empleando como link la columna
; Link de ENTRADA_1
; El HTML descargado se almacena en la columna
; TEMP_HTML de SALIDA
; -------------------------------------<DESCARGAR_HTML>
COLUMNA = "TEMP_HTML"
LINK = "<% ENTRADA_1:Link %>"
</DESCARGAR_HTML>
; Extraer el nombre del producto del
; html descargado
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "Nombre"
TAG_INICIO = "<div class=\"product-name\""
TAG_FINAL = "</div>"
</EXTRAER_TEXTO_DESDE_TEXTO>
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA: Nombre %>"
COLUMNA = "Nombre"
TAG_INICIO = ">"
TAG_FINAL = "</h1>"
</EXTRAER_TEXTO_DESDE_TEXTO>
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA: Nombre %>"
COLUMNA = "Nombre"
TAG_INICIO = ">"
TAG_FINAL = ""
</EXTRAER_TEXTO_DESDE_TEXTO>
; Extraer el Precio del producto del html
; descargado a la columna "Precio"
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "Precio"
TAG_INICIO = "<span class=\"price\">"
TAG_FINAL = "</span>"

Pagina 72

Manual CSV Robot v1.0 - Rev A

</EXTRAER_TEXTO_DESDE_TEXTO>
; Extraer descripcion del producto del html
; descargado a la columna "TEMP_DESCRIPCION"
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "TEMP_DESCRIPCION"
TAG_INICIO = "<table border=\"1\""
TAG_FINAL = "</table>"
INCLUIR_TAGS = "1"
</EXTRAER_TEXTO_DESDE_TEXTO>
; Extraer link de la imagen principal
; del producto a la columna "TEMP_IMAGEN"
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "TEMP_IMAGEN"
TAG_INICIO = "<p class=\"product-image"
TAG_FINAL = "</p>"
</EXTRAER_TEXTO_DESDE_TEXTO>
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_IMAGEN %>"
COLUMNA = "TEMP_IMAGEN"
TAG_INICIO = "http://www"
TAG_FINAL = ".jpg "
INCLUIR_TAGS = "1"
</EXTRAER_TEXTO_DESDE_TEXTO>
; Extraer del HTML de la pagina los links de las
; imagenes del producto
; Primero extraer el div contenedor de las
; imagenes en TEMP_IMAGENES
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "TEMP_IMAGENES"
TAG_INICIO = "<div class=\"more-views\""
TAG_FINAL = "</div>"
</EXTRAER_TEXTO_DESDE_TEXTO>
; del div obtenido, extraer un array con todos los
; elementos <li> contenidos en su interior
; -------------------------------------<EXTRAER_ARRAY_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_IMAGENES %>"
COLUMNA = "TEMP_IMAGENES"
TAG_INICIO = "<li"

Pagina 73

Manual CSV Robot v1.0 - Rev A

TAG_FINAL = "</li>"
</EXTRAER_ARRAY_DESDE_TEXTO>
; del array obtenido, procesar cada elemento extrayendo
; el link de la imagen que se encuentra en el interior
; los elementos resultantes de la extraccin se mantienen
; como array en TEMP_IMAGENES
; -------------------------------------<EXTRAER_ARRAY_DESDE_ARRAY>
TEXTO = "<% SALIDA:TEMP_IMAGENES %>"
COLUMNA = "TEMP_IMAGENES"
TAG_INICIO = "<img src=\""
TAG_FINAL = "\""
</EXTRAER_ARRAY_DESDE_ARRAY>
; En el array de links extraido, reemplazar "thumbnail/56x"
; por "image" en todos los links, para obtener los links
; de las imagenes a tamao real
; -------------------------------------<REEMPLAZAR_TEXTO_EN_TEXTO>
TEXTO = "<% SALIDA:TEMP_IMAGENES %>"
COLUMNA = "TEMP_IMAGENES"
BUSCAR = "thumbnail/56x"
REEMPLAZAR = "image"
REPETIR = "100"
</REEMPLAZAR_TEXTO_EN_TEXTO>
; Crear directorio y nombrarlo con el valor de
; la columna ID de ENTRADA_1
; -------------------------------------<CREAR_DIRECTORIO>
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
</CREAR_DIRECTORIO>
; Crear archivo con Descripcion.html, con el
; contenido de la columna TEMP_DESCRIPCION,
; en el directorio creado previamente
; -------------------------------------<CREAR_ARCHIVO>
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
NOMBRE_ARCHIVO = "Descripcion.html"
CONTENIDO_ARCHIVO = "<%
SALIDA:TEMP_DESCRIPCION %>"
</ CREAR_ARCHIVO >
; Descargar archivo desde el link indicado en
; TEMP_IMAGEN, guardarlo en el directorio creado
; previamente, y con nombre Img_principal.jpg
; -------------------------------------<DESCARGAR_ARCHIVO>

Pagina 74

Manual CSV Robot v1.0 - Rev A

NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"


NOMBRE_ARCHIVO = "Img_principal.jpg"
LINK = "<% SALIDA:TEMP_IMAGEN %>"
</ DESCARGAR_ARCHIVO >
; Eliminar columna TEMP_HTML
; -------------------------------------<QUITAR_COLUMNA>
COLUMNA = "TEMP_HTML"
</QUITAR_COLUMNA >
; Eliminar columna TEMP_DESCRIPCION
; -------------------------------------<QUITAR_COLUMNA>
COLUMNA = "TEMP_DESCRIPCION"
</QUITAR_COLUMNA >
; Eliminar columna TEMP_IMAGEN
; -------------------------------------<QUITAR_COLUMNA>
COLUMNA = "TEMP_IMAGEN"
</QUITAR_COLUMNA >
</PROCESOS>
</ROOT>

Pagina 75

Manual CSV Robot v1.0 - Rev A

6.3 Proceso DESCARGAR_ARCHIVOS_DESDE_ARRAY


Para concluir con nuestro proyecto de extraccin de las imgenes de nuestro producto
de inters, nos hace falta un proceso capaz de descargar un conjunto de archivos desde
la web, tomando los links de los mismos desde un array. Ese proceso es
DESCARGAR_ARCHIVOS_DESDE_ARRAY. Los parmetros son los mismos que
para DESCARGAR_ARCHIVO:
NOMBRE_DIRECTORIO = DDD - Obligatorio, es el directorio en el cual se
guardarn los archivos descargado. Si se especifica como valor del parmetro, los
archivos sern descargados en el mismo directorio del script.
NOMBRE_ARCHIVO = AAA - Obligatorio, indica el nombre que se le asignar al
archivo descargado. Si se proporciona como valor, el archivo se guardar con su
nombre original
LINK = LLL - Obligatorio, indica el link del cual descargar el archivo. Este link, se
interpreta como array de valores, separados por el carcter ,. Se descargar cada uno
de los archivos del array.
Nota Importante: Recordar siempre que los arrays, pueden contener un nico
elemento y no por ello dejan de considerase arrays. Es mas, podramos generalizar y
definir todos los valores como arrays de un elemento o mas. Todos los procesos que
trabajan sobre arrays, si son alimentados por arrays de un elemento, arrojaran los
mismos resultados que los procesos que trabajan sobre elementos nicos. Por
ejemplo, el proceso EXTRAER_ARRAY_DESDE_ARRAY, si se alimenta con un
array de un elemento, arrojar un array de un elemento, y el resultado ser el mismo
que aplicar el proceso EXTRAER_TEXTO_DESDE_TEXTO.
6.3.1 Ejemplo 12 Descarga de array de archivos
Este ejemplo es la continuacin lgica de los ejemplos 10 u 11 (Ambos obtienen el
mismo resultado, pero de maneras distintas). En ambos ejemplos, obtenemos un array
de links con las imgenes del producto. Ahora resta emplear ese array para descargar las
imgenes al disco. Lo haremos en el directorio que se creo a tal fin con el valor de la
columna SKU
<DESCARGAR_ARCHIVOS_DESDE_ARRAY>
(1)
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
(2)
NOMBRE_ARCHIVO = ""
(3)
LINK = "<% SALIDA:TEMP_IMAGENES %>"
</DESCARGAR_ARCHIVOS_DESDE_ARRAY>
Aqu estamos definiendo:
1- El nombre del directorio en el cual se descargar el archivo esta en la columna ID del
registro ENTRADA_1 (Recordemos que el proceso CREAR_DIRECTORIO cre un
directorio previamente con ese nombre, por lo que se va a crear para cada producto, un
directorio propio, y dentro de ese directorio, las descargas.
2 Los archivos no sern renombrados.
3 Los links de los archivos a descargar se encuentran en un array de valores en la
columna TEMP_IMAGENES del registro SALIDA

Pagina 76

Manual CSV Robot v1.0 - Rev A

Nota Importante: Ntese que el caso de emplear el proceso


DESCARGAR_ARCHIVOS_DESDE_ARRAY, SIEMPRE, deber emplear el
parmetro NOMBRE_ARCHIVO = . Si se coloca un valor en dicho parmetro,
cada archivo descargado ser renombrado segn el parmetro, y como el parmetro
es fijo, sobrescribir al anterior. Este parmetro se mantiene por compatibilidad con
futuras funciones de CSV Robot.
Al ejecutar este proceso, obtenemos los archivos descargados en el directorio con
nombre del ID de cada producto.
Finalmente, vamos a eliminar la columna TEMP_IMAGENES antes de terminar el
script.
Esta es la transcripcin completa del script del ejemplo 11. Se han resaltado con color
los procesos aadidos para este ejemplo:
<ROOT>
; Parametros de Configuracion
; --------------------------------------------------------------<CONFIG>
ARCHIVO_ENTRADA_1 = "Links.txt"
ARCHIVO_SALIDA = "Salida.txt"
</CONFIG>
; LISTA DE PROCESOS
; --------------------------------------------------------------<PROCESOS>
;Copiar columna ID desde ENTRADA_1 a SALIDA
; -------------------------------------<SETEAR_VALOR_COLUMNA>
COLUMNA = "ID"
VALOR = "<% ENTRADA_1:ID %>"
</SETEAR_VALOR_COLUMNA>
; Descargar HTML empleando como link la columna
; Link de ENTRADA_1
; El HTML descargado se almacena en la columna
; TEMP_HTML de SALIDA
; -------------------------------------<DESCARGAR_HTML>
COLUMNA = "TEMP_HTML"
LINK = "<% ENTRADA_1:Link %>"
</DESCARGAR_HTML>
; Extraer el nombre del producto del
; html descargado
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "Nombre"

Pagina 77

Manual CSV Robot v1.0 - Rev A

TAG_INICIO = "<div class=\"product-name\""


TAG_FINAL = "</div>"
</EXTRAER_TEXTO_DESDE_TEXTO>
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA: Nombre %>"
COLUMNA = "Nombre"
TAG_INICIO = ">"
TAG_FINAL = "</h1>"
</EXTRAER_TEXTO_DESDE_TEXTO>
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA: Nombre %>"
COLUMNA = "Nombre"
TAG_INICIO = ">"
TAG_FINAL = ""
</EXTRAER_TEXTO_DESDE_TEXTO>
; Extraer el Precio del producto del html
; descargado a la columna "Precio"
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "Precio"
TAG_INICIO = "<span class=\"price\">"
TAG_FINAL = "</span>"
</EXTRAER_TEXTO_DESDE_TEXTO>
; Extraer descripcion del producto del html
; descargado a la columna "TEMP_DESCRIPCION"
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "TEMP_DESCRIPCION"
TAG_INICIO = "<table border=\"1\""
TAG_FINAL = "</table>"
INCLUIR_TAGS = "1"
</EXTRAER_TEXTO_DESDE_TEXTO>
; Extraer link de la imagen principal
; del producto a la columna "TEMP_IMAGEN"
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "TEMP_IMAGEN"
TAG_INICIO = "<p class=\"product-image"
TAG_FINAL = "</p>"
</EXTRAER_TEXTO_DESDE_TEXTO>
<EXTRAER_TEXTO_DESDE_TEXTO>

Pagina 78

Manual CSV Robot v1.0 - Rev A

TEXTO = "<% SALIDA:TEMP_IMAGEN %>"


COLUMNA = "TEMP_IMAGEN"
TAG_INICIO = "http://www"
TAG_FINAL = ".jpg "
INCLUIR_TAGS = "1"
</EXTRAER_TEXTO_DESDE_TEXTO>

; Extraer del HTML de la pagina los links de las


; imagenes del producto
; Primero extraer el div contenedor de las
; imagenes en TEMP_IMAGENES
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "TEMP_IMAGENES"
TAG_INICIO = "<div class=\"more-views\""
TAG_FINAL = "</div>"
</EXTRAER_TEXTO_DESDE_TEXTO>
; del div obtenido, extraer un array con todos los
; elementos <li> contenidos en su interior
; -------------------------------------<EXTRAER_ARRAY_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_IMAGENES %>"
COLUMNA = "TEMP_IMAGENES"
TAG_INICIO = "<li"
TAG_FINAL = "</li>"
</EXTRAER_ARRAY_DESDE_TEXTO>
; del array obtenido, procesar cada elemento extrayendo
; el link de la imagen que se encuentra en el interior
; los elementos resultantes de la extraccin se mantienen
; como array en TEMP_IMAGENES
; -------------------------------------<EXTRAER_ARRAY_DESDE_ARRAY>
TEXTO = "<% SALIDA:TEMP_IMAGENES %>"
COLUMNA = "TEMP_IMAGENES"
TAG_INICIO = "<img src=\""
TAG_FINAL = "\""
</EXTRAER_ARRAY_DESDE_ARRAY>
; En el array de links extraido, reemplazar "thumbnail/56x"
; por "image" en todos los links, para obtener los links
; de las imagenes a tamao real
; -------------------------------------<REEMPLAZAR_TEXTO_EN_TEXTO>
TEXTO = "<% SALIDA:TEMP_IMAGENES %>"
COLUMNA = "TEMP_IMAGENES"
BUSCAR = "thumbnail/56x"

Pagina 79

Manual CSV Robot v1.0 - Rev A

REEMPLAZAR = "image"
REPETIR = "100"
</REEMPLAZAR_TEXTO_EN_TEXTO>
; Crear directorio y nombrarlo con el valor de
; la columna ID de ENTRADA_1
; -------------------------------------<CREAR_DIRECTORIO>
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
</CREAR_DIRECTORIO>
; Crear archivo con Descripcion.html, con el
; contenido de la columna TEMP_DESCRIPCION,
; en el directorio creado previamente
; -------------------------------------<CREAR_ARCHIVO>
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
NOMBRE_ARCHIVO = "Descripcion.html"
CONTENIDO_ARCHIVO = "<%
SALIDA:TEMP_DESCRIPCION %>"
</ CREAR_ARCHIVO >
; Descargar archivo desde el link indicado en
; TEMP_IMAGEN, guardarlo en el directorio creado
; previamente, y con nombre Img_principal.jpg
; -------------------------------------<DESCARGAR_ARCHIVO>
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
NOMBRE_ARCHIVO = "Img_principal.jpg"
LINK = "<% SALIDA:TEMP_IMAGEN %>"
</ DESCARGAR_ARCHIVO >
; Descargar los archivos de imagenes del producto
; Los links de descarga provienen de un array en la
; columna TEMP_IMAGENES del registro de salida.
; -------------------------------------<DESCARGAR_ARCHIVOS_DESDE_ARRAY>
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
NOMBRE_ARCHIVO = ""
LINK = "<% SALIDA:TEMP_IMAGENES %>"
</DESCARGAR_ARCHIVOS_DESDE_ARRAY>
; Eliminar columna TEMP_HTML
; -------------------------------------<QUITAR_COLUMNA>
COLUMNA = "TEMP_HTML"
</QUITAR_COLUMNA >
; Eliminar columna TEMP_DESCRIPCION
; --------------------------------------

Pagina 80

Manual CSV Robot v1.0 - Rev A

<QUITAR_COLUMNA>
COLUMNA = "TEMP_DESCRIPCION"
</QUITAR_COLUMNA >
; Eliminar columna TEMP_IMAGEN
; -------------------------------------<QUITAR_COLUMNA>
COLUMNA = "TEMP_IMAGEN"
</QUITAR_COLUMNA >
; Eliminar columna TEMP_IMAGENES
; -------------------------------------<QUITAR_COLUMNA>
COLUMNA = "TEMP_IMAGENES"
</QUITAR_COLUMNA >
</PROCESOS>
</ROOT>

Pagina 81

Manual CSV Robot v1.0 - Rev A

7. Notas finales de este manual


Hemos llegado al final del manual de uso de CSV Robot.
A lo largo de este manual hemos visto la funcionalidad de CSV Robot para procesar
archivos CSV y para realizar tareas de web scraping. Este software naci sobre una
necesidad real, ya que yo mismo, su programador (Marcos Correas), poseo una tienda
online, y este software naci de mi propia necesidad de procesar grandes archivos CSV
para mi propio uso, y tambin para algunos de mis clientes que poseen tiendas online. A
lo largo de los ltimos captulos de este manual hemos ido escribiendo paso a paso un
script muy completo para CSV Robot que demuestra las funcionalidades bsicas y
avanzadas en una aplicacin real. Espero que este software pueda suplir todas sus
necesidades de trabajo con archivos CSV y web Scraping.
7.1 Versin de demostracin de CSV Robot
Para todos aquellos usuarios que deseen probar toda la funcionalidad de CSV Robot
antes de adquirir el software, se ha compilado una versin de demostracin, que posee
toda la funcionalidad de la versin completa. La nica particularidad de la versin de
demostracin, es que est limitada a un procesamiento de no ms de 5 registros de
entrada. Independientemente de la longitud del archivo de datos que se cargue, esta
versin solo procesar los primeros 5 registros del archivo.
7.2 Como adquirir la versin completa de CSV Robot?
Para adquirir la versin completa de CSV Robot, consulte mediante correo electrnico a
marcos_correas@yahoo.com.ar
7.3 Contacto con el programador y reporte de errores
Cualquier bug o error encontrado en el funcionamiento del software se puede reportar a
mi correo personal marcos_correas@yahoo.com.ar
Es deseable que en el correo adjunte los archivos de datos y el script que produjeron el
error, as como una descripcin detallada del mismo a fin de reproducirlo y corregirlo.
Los usuarios de CSV Robot pueden emplear el mismo correo para enviar sugerencias de
nuevas funciones o mejoras a CSV Robot.
Soy un programador profesional en C# y PHP, y si usted necesita una solucin
personalizada de software para web scraping, o desea integrar la funcionalidad de CSV
Robot en su propio software comercial, no dude en contactarme.
Marcos M. Correas
Crdoba Argentina
Noviembre 2012

Pagina 82

You might also like