Páginas

viernes, 6 de febrero de 2015

Python: Como extraer texto de entre varias lineas

Me plantearon este problema, mas de mil registros similares a este:


DSP BRDMFRINFO:CN=0,SRN=80,SN=0;
CDLAGATAZOW08
+++    CDLAGATAZOW08        2015-02-06 09:58:08
O&M    #356423
%%/*36154325*/DSP BRDMFRINFO:CN=0,SRN=80,SN=0;%%
RETCODE = 0  Operation succeeded.

Display Board Manufacturing Information
---------------------------------------
               Type  =  WD5MJRUCC50
      Serial Number  =  210231964410C3000394
        Description  =  DBS3900,WD5MJRUCC50,MRRU V2,Multi-mode Multi-carries Remote Radio Unit(TX869-894MHz/RX824-849MHz,-48VDC,2.5G)
Date of Manufacture  =  2012-03-19
             Vendor  =  Huawei
       Issue Number  =  00
(Number of results = 1)


---    ENDDSP BRDMFRINFO:CN=0,SRN=80,SN=0;

Y de cada regisstro debe quedar una linea asi:

CDLAGATAZOW08,  WD5MJRUCC50

Como decirle a Python que extraiga lo que está despues de "+++" y lo que está despues de "Type"?
Bueno con una expresion regular basta, pero el problema es que se encuentran en diferentes líneas.

Lo resolví utilizando un "flag" que se encendiera cuando encontrara el "+++" en una linea, y que se apagara cuando encontrara "ENDDSP"

Mientras el flag estuviera "on" grabaría el contenido de la linea en una lista. Luego busco los patrones de texto y los escribo en otro archivo. Aqui el codigo:

import re
inFile = open("d:/byron/type.txt")
outFile = open("d:/byron/typeResponse.txt", "w")
siteList = []

#un listado con los nombres de los sitios

for line in inFile:
    match = re.search(r'^\+{3}\s{4}\w+W08', line)
    if match:
        siteName = match.group()[7:]
        siteList.append(siteName)

inFile.close()

#convierte la lista a set para evitar duplicados
siteList = set(siteList)

#crea listas con los nombres de los sitios y agrega las lineas ente +++ y ---

for site in siteList: #toma cada nombre de sitios
    inFile = open("d:/byron/type.txt")
    flag = "off"
    sList = [] # crea una lista con los datos del sitio
    for line in inFile: #lo busca en cada linea del archivo
        if ("+++" in line) and (site in line): #si encuentra el comando enviado al sitio
            #print "Flag on " + line
            flag = "on" #enciende la grabacion
        if "ENDDSP" in line:
            flag = "off" #apaga la grabacion
            #print "flag off " + line
            #deja grabar las lineas

        if flag == "on":
            sList.append(line)

    for element in sList: #toma cada dato grabado del sitio
        if "Type" in element:
            match = re.search(r'=\s\s.+', element)
            if match:
                print site +", "+ match.group()[3:] + "\n"
                outFile.write(site +", "+ match.group()[3:] + "\n")
     

    #una vez llenada la lista de datos del sitio
    #busca si existe BoardType

    inFile.close()
 
outFile.close()

No hay comentarios:

Publicar un comentario