lunes, 24 de agosto de 2009

Parser sencillo Python


#!/usr/bin/python
# -*- coding: iso-8859-15

import re
import os
import sys
import fileinput
import time

from datetime import date
from datetime import timedelta

conrec = 1
conart = 1

gtipo = ""
gunidad = ""
greceta = ""

tipos = {"Individual":"I","Colectivo":"C","Colectivas":"C"}
estampas = {}

frec = open('recetas.txt','w')
fart = open('articulos.txt','w')

def procesar_tipo(m):
global gtipo

if gtipo <> m.group(1):
gtipo = m.group(1)

def procesar_unidad(m):
global gunidad

if gunidad <> m.group(1):
gunidad = m.group(1)

def procesar_receta(m, archivo, fecha, hora):
global greceta, gunidad, gtipo, tipos, conrec, frec

if greceta <> m.group(1):
greceta = re.sub('\|','',m.group(1))

conrec += 1
if len(m.groups()) == 3:
nombre = ""
else:
nombre = re.sub('\|','',m.group(3).strip())

fecha_rec = m.group(2)

if (fecha == ''):
estampa = fecha_rec.split("/")
estampa = date(int(estampa[2]),int(estampa[1]),int(estampa[0]))
estampa = estampa + timedelta(days=1);
else:
estampa = fecha

cadena = "%s|%s|%s|%s|%s|%s|%s|%s|%s" % (conrec,greceta.strip(),gunidad,tipos[gtipo],nombre,fecha_rec,archivo,estampa,hora)
#print cadena
frec.write(cadena + "\n")

def qcomas(cadena):
return re.sub(',','',cadena)

def procesar_articulo_cp(m):
global conart, conrec, fart

conart += 1
cadena = "%s|%s|%s|%s|%s|%s" % (conart,conrec,m.group(1).strip(),qcomas(m.group(4)),qcomas(m.group(5)),qcomas(m.group(3)))
#print cadena
fart.write(cadena + "\n")

def procesar_articulo_sp(m):
global conart, conrec, fart

conart += 1
cadena = "%s|%s|%s|%s|%s|%s" % (conart,conrec,m.group(1).strip(),qcomas(m.group(3)),qcomas(m.group(4)),0.0)
#print cadena
fart.write(cadena + "\n")

def parse(linea, archivo, fecha, hora):
tipo = "Reporte de\s+(\w+)"
tipo_surtimiento = "Reporte de Surtimiento\s+(\w+)"
unidad = "UNIDAD\s+(\d+)"
receta = "([\w|\s|\-]+)\s+(\d+\/\d+\/\d+)\s+([\w|\s|\À|,|\(|\)|\.|\Ñ|\/|\`|\-]*[\w|\.]\s\s\s)\s+(\w+)"
#receta = "([\w|\s|\-]+)\s+(\d+\/\d+\/\d+)\s+(\w+)"
receta_sn = "([\w|\s|\-]+)\s+(\d+\/\d+\/\d+)\s+(\w+)"
articulo_cp = "((\w+[\s|\/|\.|\-])*\w+)\s+[\w|\d|\s|\:|\.|,|\;|\(|\)|\/\%|\-|Á|É|Í|Ó|Ú|Ü|á|é|í|ó|ú|ü|À|È|Ì|Ò|Ù|à|è|ì|ò|ù|Ñ|ñ]*\s+\$\s+([\d+,]*\d+\.\d+)\s+([\d+,]*\d+)\s+([\d+,]*\d+)\s+\$\s+([\d+,]*\d+\.\d+)"
articulo_sp = "((\w+[\s|\/|\.|\-])*\w+)\s+[\w|\d|\s|\:|\.|,|\;|\(|\)|\/\%|\-|Á|É|Í|Ó|Ú|Ü|á|é|í|ó|ú|ü|À|È|Ì|Ò|Ù|à|è|ì|ò|ù|Ñ|ñ]*\s+([\d+,]*\d+)\s+([\d+,]*\d+)"
patrones = {"tipo":tipo,"tipo_surtimiento":tipo_surtimiento,"unidad":unidad,"receta_cn":receta,"receta_sn":receta_sn,"articulo_cp":articulo_cp,"articulo_sp":articulo_sp}

for llave,patron in patrones.iteritems():
m = re.match(patron, linea)

if m <> None:
if llave == "tipo_surtimiento":
procesar_tipo(m)
elif llave == "tipo":
procesar_tipo(m)
elif llave == "unidad":
procesar_unidad(m)
elif llave == "receta_cn":
procesar_receta(m, archivo, fecha, hora)
elif llave == "receta_sn":
procesar_receta(m, archivo, fecha, hora)
elif llave == "articulo_cp":
procesar_articulo_cp(m)
elif llave == "articulo_sp":
print "Holas"
procesar_articulo_sp(m)
break

def recorrer_lineas(path, archivo, fecha, hora):
for line in fileinput.input(path + archivo):
parse(line, archivo, fecha, hora)

def recorrer_archivos(directorio):
global frec, fart, estampas

for base, dirs, files in os.walk(directorio+"txt/"):
for f in files:
#print "parsing: %s ..." % (f)
estampa = estampas[f[:-3]]
recorrer_lineas(base,f,estampa['fecha'],estampa['hora'])
#recorrer_lineas(base,f,'','')

frec.close()
fart.close()

def obtener_estampa(directorio):
global estampas
estampa = {}

for base, dirs, files in os.walk(directorio+"pdf/"):
for f in files:
tiempo = os.stat(base + f)
estampa['fecha'] = time.strftime("%Y-%m-%d",time.localtime(tiempo.st_mtime))
estampa['hora'] = time.strftime("%I:%M:%S",time.localtime(tiempo.st_mtime))
estampas[f[:-3]] = estampa

def main():
if len(sys.argv) >=2:
obtener_estampa(sys.argv[1])
recorrer_archivos(sys.argv[1])
else:
print "Debe indicar la ruta de los archivos pdf y txt"

if __name__ == '__main__':
main()

No hay comentarios: