Extraer información de varios .txt con misma distribución

He empezado en una empresa y necesito pasar a excel un montón de datos que están en html.

Necesito un script o similar que al ejecutarlo entre en un .txt y devuelva la información contenida entre:

,"name": "         y          "

, "taxID" : "         y          "

, "isicV4" : "         y          "

, "url" : "         y          "

, "telephone" : "         y          "

, "email" : "         y          "

, "faxNumber" : "         y          "

, "description" : "         y          "

, "addressRegion" : "         y          "

, "streetAddress" : "         y          "

, "postalCode" : "         y          "

, "AddressLocality" : "         y          "

constituida el                   y                        en

empleados de entre                   y                y un

ventas de más de                           y                      .

ha sido publicado el                      y                         ,

Y la ordene de forma estructurada en un csv,

NAME;TAXID;ISICV4;URL;TELEPHONE;EMAIL;FAXNUMBER;DESCRIPTION; ... Etc

1; prueba1; 9000000; ordenado; hola;

Si no encuentra uno de los valores que buscados que aparezca en su lugar "No disponible"

Respuesta
1

La información que quieres extraer, ¿está organizada en líneas? ¿Puedes aportar un ejemplo, real o ficticio, de un html como los que quieres tratar?

Buenas tardes y gracias de antemano.

La información está en varios html que he juntado en uno solo y cambiado la extensión a .txt

Un caso concreto sería el siguiente:

https://mega.nz/#!cwx2TaCY!sOK82vNVpHPB2vEoBgOqP63zH7mP8CQ5ClvU-wX644w

Un saludo y muchas gracias

Me he descargado el archivo pero no veo claro como se podría tratar con un script bat, que es en lo que estoy un poco especializado. Este tipo de scripts tienen posibilidades cuando se pueden hacer tratamientos línea a línea, considerando una línea como algo que termina el 0x0A0D (cambio de línea + retorno de carro) y que no supera los 4096 caracteres. Me da la impresión de que no es el caso.

Supongo que el "esquema de trabajo" sería algo así:

1. Localizar la cadena,"name": " e incluir en una variable todo lo que siga hasta el próximo carácter ".

2. A partir de ese punto localizar la cadena, "taxID" : " e incluir en otra variable todo lo que siga hasta el próximo carácter ".

3. Repetir estos procesos para las distintas cadenas

4. Al llegar a tratar la cadena final grabar en el archivo de salida los valores de las distintas variables separados por ; y volver al punto 1

En este esquema (que como digo podría ser difícil de tratar con un BAT) encaja bastante mal el no encontrar una de las cadenas porque habría que volver a empezar después de haber llegado al final.

Una vez más creo que tal vez PowerShell pudiera dar más posibilidades, aunque sigo viendo difícil el asunto.

¿Has pensado en tratarlo dentro del mundo HTML o XML? Se supone que estos datos estructurados están pensados para facilitar ese tipo de tratamientos, aunque imagino que eso te obligaría a trabajar en java o php, lenguajes que no domino.

De todas formas intentaré algo por si me viniera una inspiración más o menos divina... Si se me ocurre alguna solución te lo diré.

Examinando con más cuidado el archivo de ejemplo he visto que la información de interés está, a veces, en líneas separadas, una línea para cada cadena a buscar con su información en la propia línea. Pero otras veces no es así.

Concretando si busco en ese archivo la "cadena de arranque de tratamiento", es decir:

,"name":

Encuentro casos de líneas como

"itemListElement": [{"@type":"ListItem", "position":"1", "item":{"@context":"http://schema.org/","@type":"Product","name":"Informe axesor 360º","description":"El informe más completo y actualizado del mercado que le permitirá llevar a cabo un estudio pormenorizado de la sociedad y su entorno.","productID":"3025030-159","brand":{"@type":"Thing","name":"axesor"}, "category": "IE", "url": "https://www.axesor.es/Informes-Empresas/3025030/EXPLOTACIONES_ABANTO_SL.html#1", "offers":{"@type":"Offer","priceCurrency":"EUR","price":"43,00"}}},{"@type":"ListItem", "position":"2", "item":{"@context":"http://schema.org/","@type":"Product","name":"Informe de Crédito","description":"El informe que le proporciona la información detallada de riesgo de la sociedad para la toma de decisiones de concesión o denegación del crédito comercial.","productID":"3025030-1094","brand":{"@type":"Thing","name":"axesor"}, "category": "IE", "url": "https://www.axesor.es/Informes-Empresas/3025030/EXPLOTACIONES_ABANTO_SL.html#2", "offers":{"@type":"Offer","priceCurrency":"EUR","price":"24,95"}}},{"@type":"ListItem", "position":"3", "item":{"@context":"http://schema.org/","@type":"Product","name":"Perfil Comercial de Empresa","description":"Contiene los datos básicos de identificación y localización de la sociedad, completados con información y análisis de gran valor comercial.","productID":"3025030-1070","brand":{"@type":"Thing","name":"axesor"}, "category": "IE", "url": "https://www.axesor.es/Informes-Empresas/3025030/EXPLOTACIONES_ABANTO_SL.html#3", "offers":{"@type":"Offer","priceCurrency":"EUR","price":"2,70"}}}]

Con varias ocurrencias en la misma línea. Y otros como:

,"name": "Obras y Construcciones Peimon Sociedad Limitada"

Con una sola ocurrencia por línea.

Obviamente si solo hubiera que tratar los casos de este segundo tipo sería más sencillo. Aclárame esto si quieres.

He seguido un poco con esto y me he dado cuenta de que la "cadena de arranque de tratamiento", tal como la presentas en tu consulta, no era exactamente la que yo había puesto sino esta otra:

,"name": "

Eso parece despejar mi duda porque ya solo me salen casos del tipo segundo (una sola ocurrencia por línea). A partir de ahí he preparado un script que, de momento, solo captura ese primer campo (name) para que me digas si puede servir como punto de partida. Aunque ya te aviso que queda bastante por hacer porque no encuentro una forma sencilla de seguir tratando las líneas siguientes sin habilitar todo un proceso de control de la línea que estamos tratando, y eso complica bastante el asunto. Este sería el script simplificado:

@echo off
Setlocal EnableDelayedExpansion
rem echo NAME;TAXID;ISICV4;URL;TELEPHONE;EMAIL;FAXNUMBER;DESCRIPTION;ADDRESSREGION;STREETADDRESS;POSTALCODE;ADDRESSLOCALITY;CONSTDATE;EMPLOYNUMBER;SALES;INFODATE>prueba.csv
echo NAME;TAXID;ISICV4;URL;TELEPHONE;EMAIL>prueba.csv
set "cad1=,\"name\": "
set "cad2=, \"taxID\" : "
set "cad3=, \"isicV4\" : "
set "cad4=, \"url\" : "
set "cad5=, \"telephone\" : "
set "cad6=, \"email\" : "
for /f "tokens=*" %%a in ('findstr /C:"%cad1%" prueba.txt') do (
   set vartmp=%%a&echo !vartmp:~10,-1!;>>prueba.csv
   )

Si quieres lo pruebas y me dices algo.

Me crea un csv con los valores  name, taxid, isicv4 etc

pero no rellena los datos, es como si no supiese a que archivo aplicarlo.

De todos modos yo en DOS estoy bastante limitado, he conseguido extraer yo es información en excel pero con los siguientes campos soy incapaz

constituida el                   y                        en

empleados de entre                   y                y un

ventas de más de                           y                      .

ha sido publicado el                      y                         ,

Espero que puedas ayudarme. Gracias

¿Tienes el archivo prueba.txt en el directorio del bat?

Dime, de todas formas, como querrías que sacara esos datos y si voy bien en cuanto a las líneas a tratar (solo las que siguen a una que empieza por

,"name": "

Y le sigue el nombre de la empresa, solamente.

Al intentar incorporar los otros campos que te dan problemas he visto que esos campos no siguen la regla que comentaba sino que están integrados en código html. No se me ocurre como asociar esos campos al "name" y los otros campos agrupados según el otro criterio. Creo que un BAT no va a poder hacerlo.

1 respuesta más de otro experto

Respuesta

Puedes hacerte un programa utilizando expresiones regulares para captar las partes del código que te interesan para pasarlas al formato que desees. Los lenguajes de programación que puedes utilizar son muchísimos (prácticamente cualquier lenguaje de programación "famoso" que encuentres tendrá acceso a expresiones regulares).

Otra opción, quizás la mejor para tu caso, es utilizar herramientas de Scraping que te permiten extraer información de una web de forma sencilla sin tener que descargarte los HTML de dicha página. En este aspecto te recomendaría "Web Scrapper" (que tiene la ventaja de ser un plugin de Google Chrome), "Octoparse" o, si tienes conocimientos de programación en Python, "Beautiful Soup".

Si estás interesado en utilizar Beautiful Soup, pon un comnetario y te paso un ejemplo real que hice para extraer datos de los órganos judiciales españoles.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas