From 77fef039e080e7b25e5b4843969496b184bb0031 Mon Sep 17 00:00:00 2001 From: binlaab Date: Tue, 9 Dec 2025 11:09:08 +0100 Subject: [PATCH] terminado --- proyecto/filtrado.py | 51 +++++++----- log.txt => proyecto/log.txt | 0 proyecto/main.py | 40 ++-------- proyecto/normalizacion.py | 114 ++++++++++++++++++--------- proyecto/util.py | 83 ++++++++++++++++++++ proyecto/validacion.py | 151 +++++++++++------------------------- proyecto/variables.py | 2 +- sesion6.py | 2 +- 8 files changed, 249 insertions(+), 194 deletions(-) rename log.txt => proyecto/log.txt (100%) create mode 100644 proyecto/util.py diff --git a/proyecto/filtrado.py b/proyecto/filtrado.py index e0a456e..6e600ac 100644 --- a/proyecto/filtrado.py +++ b/proyecto/filtrado.py @@ -1,41 +1,56 @@ -from validacion import * from normalizacion import * +from validacion import validarCoordenada +from util import haversine, convertirSegundos def filtrar_telefono(fichero, tel): f = open(fichero, "r", encoding="utf-8") - tel_n = normalizar_telefono(tel) - for i in f.readlines(): - telefono = normalizar_telefono(i.split(";")[0]) + tel_n = normalizarTelefono(tel) + for linea in f.readlines(): + telefono = normalizarTelefono(linea.split(";")[0]) if telefono.strip() == tel_n: - print(i) + print(linea, end='') else: continue def filtrar_nif(fichero, nif): f = open(fichero, "r", encoding="utf-8") - for i in f.readlines(): - n = i.split(";")[1] + if D.match(nif) is None: + exit(2) + + for linea in f.readlines(): + n = linea.split(";")[1] if n.strip() == nif: - print(i) + print(linea, end='') else: continue def filtrar_instante(inicio, fin, fichero): - # no hace falta normalizar todo, solo convertir el mes cuando es el de letra - n = 0 f = open(fichero, "r", encoding="utf-8") - inicio = validarInstante(normalizar_instante(inicio.strip(), 3)) - fin = validarInstante(normalizar_instante(fin.strip(), 3)) + inicio = convertirSegundos(validarInstante(inicio)) + fin = convertirSegundos(validarInstante(fin)) + + tupla_inicio = tuple([int(inicio[k]) for k in inicio.keys()]) tupla_fin = tuple([int(fin[k]) for k in fin.keys()]) - for i in f.readlines(): - if validarCoordenada(i.split(';')[3].strip(), 3) is None: + + for linea in f.readlines(): + instante = linea.split(';')[2].strip() + if validarCoordenada(linea.split(';')[3].strip()) is None: continue - instante = validarInstante(normalizar_instante(i.split(';')[2].strip(), 3)) + instante = convertirSegundos(validarInstante(instante)) tupla_instante = tuple([int(instante[k]) for k in instante.keys()]) if tupla_inicio < tupla_instante < tupla_fin: - print(i, end = '') - n += 1 + print(linea, end = '') +def filtrar_distancia(inicio, hasta, fichero): + inicio = validarCoordenada(inicio) - print(n) \ No newline at end of file + f = open(fichero, 'r', encoding="utf-8") + for linea in f.readlines(): + coordenada = linea.split(';')[3].strip() + coordenada = validarCoordenada(coordenada) + if coordenada is None: + continue + + if haversine(inicio, coordenada) < float(hasta) * 1000: + print(linea, end='') \ No newline at end of file diff --git a/log.txt b/proyecto/log.txt similarity index 100% rename from log.txt rename to proyecto/log.txt diff --git a/proyecto/main.py b/proyecto/main.py index d1fcce9..12af38b 100644 --- a/proyecto/main.py +++ b/proyecto/main.py @@ -1,43 +1,14 @@ -import regex as re import sys from filtrado import * -from validacion import * from normalizacion import * -from variables import * -# -n: normaliza el fichero en pos[-n] + 1 con los formatos: -# +34[numero] -# formato 2 para instantes temporales -# formato 3 para coordenadas -# nif, producto y precio originales -# se puede pasar f1 para el formato de las fechas y f2 para las coordenadas [param. opc.] - -# -sphone, -snif: filtran por teléfono y nif -# -stime: filtran de una fecha hasta otra -# -slocation: puntos extra - -# la salida aparece como campo1 ; campo2 ; campo3 ; ... -# los errores de formato o sintaxis en los argumentos son exit N -# los errores en el archivo se ignoran def main(): - l = open("../log.txt", encoding="utf-8") - for linea in l.readlines(): - pass - # print(validarEntrada(linea.strip())) - - - # n, sphone, stime, snif - arg_prueba = "-sphone 123456789 telefonos -stime 11:11:11 11:11:12 tiempos -n normalizar 1 2 -snif 12345678B fichero" - argumentos = r"(?P-sphone (?P\S*) (?P\S*))|(?P-stime (?P\S*) (?P\S*) (?P\S*))|(?P-n (?P\S*))|(?P-snif (?P\S*) (?P\S*))" - A = re.compile(argumentos) - match = A.finditer(arg_prueba) - argv = sys.argv try: if '-n' in argv: fichero = argv[argv.index('-n') + 1] - try: # un poco chapucero + try: formato_fecha = int(argv[argv.index('-n') + 2]) formato_coordenadas = int(argv[argv.index('-n') + 3]) except IndexError: @@ -61,12 +32,17 @@ def main(): fichero = argv[argv.index('-stime') + 3] filtrar_instante(desde, hasta, fichero) + elif '-slocation' in argv: + desde = argv[argv.index('-slocation') + 1] + hasta = argv[argv.index('-slocation') + 2] + fichero = argv[argv.index('-slocation') + 3] + filtrar_distancia(desde, hasta, fichero) + else: exit(1) + except: exit(2) - - if __name__ == "__main__": main() \ No newline at end of file diff --git a/proyecto/normalizacion.py b/proyecto/normalizacion.py index 1a2cadd..0d1fad8 100644 --- a/proyecto/normalizacion.py +++ b/proyecto/normalizacion.py @@ -1,60 +1,104 @@ -from validacion import * +from validacion import validarCoordenada, validarInstante, validarTelefono from variables import * +from util import decimalGrado, convertirSegundos -def normalizar_instante(instante, formato): + +def normalizarInstante(instante, formato): d = validarInstante(instante) if d is None: return None if formato == 1: - if not d['mes'].isdigit(): - d['mes'] = meses.index(d['mes'].lower()) + 1 + d = convertirSegundos(d) + return f"{d['año']}-{d['mes']:0>2}-{d['dia']:0>2} {d['hora']:0>2}:{d['minuto']}" elif formato == 2: - if d['mes'] in meses: - return f"{d['mes']} {d['dia']}, {d['año']} {d['hora']}:{d['minuto']} {d['segundo']}" - else: - if int(d['hora']) > 12: - d['hora'] = int(d['hora']) % 12 + try: + d['mes'] = meses[int(d['mes']) - 1] + except ValueError: + pass - if d['mes'].isdigit(): - d['mes'] = meses[int(d['mes']) - 1] + if int(d['hora']) >= 12: + d['hora'] = int(d['hora']) % 12 + if d['hora'] == 0: + d['hora'] = 12 - return f"{d['mes'].lower()} {d['dia']}, {d['año']} {d['hora']}:{d['minuto']} AM" + return f"{d['mes'].lower()} {d['dia']}, {d['año']} {d['hora']}:{d['minuto']} PM" + + if int(d['hora']) == 0: + d['hora'] = 12 + + return f"{d['mes'].lower()} {d['dia']}, {d['año']} {d['hora']}:{d['minuto']} AM" elif formato == 3: - if not d['mes'].isdigit(): - d['mes'] = meses.index(d['mes'].lower()) + 1 + d = convertirSegundos(d) + return f"{d['hora']:0>2}:{d['minuto']}:{d['segundo']:0>2} {d['dia']:0>2}/{d['mes']:0>2}/{d['año']}" - if not d['segundo'].isdigit(): - d['segundo'] = '00' - return f"{d['hora']:0>2}:{d['minuto']}:{d['segundo']} {d['dia']:0>2}/{d['mes']:0>2}/{d['año']}" + else: + return None -def normalizar_telefono(telefono): - telefono = re.sub(r'( )|(-)', r'', telefono) - if telefono[0] != '+': - return f'+34{telefono}' - return telefono +def normalizarTelefono(telefono): + telf = validarTelefono(telefono) + if telf is None: + return None + else: + if 'num' in telf: + num = re.sub(r'( )|(-)', r'', telf['num']) + return f'+{num}' + elif 'parte1' in telf: + telf = re.sub(r'( )|(-)', r'', telefono) + if telf[0] != '+': + return f'+34{telf}' + return telf + else: + return None + + +def normalizarCoordenada(coordenada, formato): + coordenada = validarCoordenada(coordenada) + if coordenada is None: + return None + + if formato == 1: + return f"{coordenada['latitud']}, {coordenada['longitud']}" + + elif formato == 2 or formato == 3: + letraLatitud = 'N' + letraLongitud = 'E' + if coordenada['latitud'] < 0: + coordenada['latitud'] *= -1 + letraLatitud = 'S' + + if coordenada['longitud'] < 0: + coordenada['longitud'] *= -1 + letraLongitud = 'W' + + gradosLatitud, minutosLatitud, segundosLatitud = decimalGrado(coordenada['latitud']) + gradosLongitud, minutosLongitud, segundosLongitud = decimalGrado(coordenada['longitud']) + + if formato == 2: + return f'{gradosLatitud}º {minutosLatitud}\' {segundosLatitud:}.0000" {letraLatitud}, {gradosLongitud}º {minutosLongitud}\' {segundosLongitud}.0000" {letraLongitud}' + + else: + return f'{gradosLatitud:0>3}{minutosLatitud:0>2}{segundosLatitud:0>2}.0000{letraLatitud}{gradosLongitud:0>3}{minutosLongitud:0>2}{segundosLongitud:0>2}.0000{letraLongitud}' + + else: + return None -def normalizar_coordenada(coordenada, formato): - c = validarCoordenada(coordenada, formato) - return c def normalizar(fichero, formato_fecha, formato_coordenadas): try: f = open(fichero, 'r', encoding='utf-8') except: exit(1) - n = 0 - for i in f.readlines(): - telefono, nif, instante, coordenada, producto, precio = i.split(";") - instante = normalizar_instante(instante.strip(), formato_fecha) - telefono = normalizar_telefono(telefono.strip()) - n_coordenada = normalizar_coordenada(coordenada.strip(), formato_coordenadas) - if n_coordenada is None: - continue - n += 1 - print(n) + for linea in f.readlines(): + telefono, nif, instante, coordenada, producto, precio = linea.split(";") + instante = normalizarInstante(instante.strip(), formato_fecha) + telefono = normalizarTelefono(telefono.strip()) + coordenada = normalizarCoordenada(coordenada.strip(), formato_coordenadas) + if coordenada is None: + continue + print(f"{telefono} ; {nif} ; {instante} ; {coordenada} ; {producto} ; {precio}", end='') \ No newline at end of file diff --git a/proyecto/util.py b/proyecto/util.py new file mode 100644 index 0000000..b6f0595 --- /dev/null +++ b/proyecto/util.py @@ -0,0 +1,83 @@ +from variables import letras, meses +import math + +def signoLetra(signo1, signo2): + if signo1 == '+': + letra1 = 'N' + else: + letra1 = 'S' + + if signo2 == '+': + letra2 = 'E' + else: + letra2 = 'W' + + return letra1, letra2 + +def letraSigno(letra): + if letra == 'N' or letra == 'E': + signo = '+' + elif letra == 'S' or letra == 'W': + signo = '-' + + else: + return None + + return signo + +def decimalGrado(numero): + a = float(numero) + grados = int(numero) + b = a - grados + minutos = int(b*60) + c = b*60-minutos + segundos = int(c*60) + return grados,minutos,segundos + + +def gradoDecimal(grados,minutos,segundos): + a = float(segundos)/3600 + float(minutos)/60 + float(grados) + return a + +def comprobarLetra(dni: str): + num = int(dni[:-1]) + letra = dni[-1] + if letras[num % 23] != letra: + return False + else: + return True + +def convertirMes(mes): + return meses.index(mes) + +def haversine(coord1, coord2): + r = 6367.45 * 1000 # conversión a metros + dlat = coord2['latitud'] - coord1['latitud'] + dlong = coord2['latitud'] - coord1['longitud'] + + dlat = math.radians(dlat) + dlong = math.radians(dlong) + + h = math.sin(dlat)**2 + math.cos(dlat) * math.cos(dlong) * math.sin(dlong)**2 + d = 2 * r * math.asin(math.sqrt(h)) + return d + +def convertirSegundos(instante): + try: + int(instante['mes']) + except ValueError: + instante['mes'] = convertirMes(instante['mes'].lower()) + + try: + int(instante['segundo']) + + except ValueError: + if instante['segundo'].lower == "pm": + instante['hora'] += 12 + + if instante['hora'] == 24: + instante['hora'] = 0 + + instante['segundo'] = 0 + + return instante \ No newline at end of file diff --git a/proyecto/validacion.py b/proyecto/validacion.py index 7939caa..2985f14 100644 --- a/proyecto/validacion.py +++ b/proyecto/validacion.py @@ -1,32 +1,21 @@ -import regex as re from variables import * - -def comprobarLetra(dni: str): - num = int(dni[:-1]) - letra = dni[-1] - if letras[num % 23] != letra: - return False - else: - return True +from util import comprobarLetra, gradoDecimal, letraSigno -def validarTelefono(telefono): # revisar sesión 6 ej 1 +def validarTelefono(telefono): match = T.match(telefono) - if match is not None: - # if match.group('prefijo') is None: - # prefijo = '+34' - # else: - # prefijo = match.group('prefijo') + if match is not None and not match['num']: return { - # 'prefijo': prefijo, 'parte1': match.group('parte1'), 'parte2': match.group('parte2'), 'parte3': match.group('parte3'), } - - return None - - + elif match is not None and match['num']: + return { + 'num': match.group('num'), + } + else: + return None def validarDni(dni): match = D.match(dni) @@ -46,7 +35,8 @@ def validarDni(dni): 'numero': match['numero'], 'letrafinal': match.group('letrafinal'), } - return None + else: + return None else: return None @@ -75,95 +65,42 @@ def validarInstante(instante): return None -def decimalGrado(numero): - a = float(numero) - grados = int(numero) - b = a - grados - minutos = int(b*60) - c = b*60-minutos - segundos = int(c*60) - return grados,minutos,segundos + +def validarCoordenada(cadena): + m = P.fullmatch(cadena) + if m is not None: + if m.group("Grados1"): + grados1 = m.group("Grados1") + grados2 = m.group("Grados2") + minutos1 = m.group("Minutos1") + minutos2 = m.group("Minutos2") + segundos1 = m.group("Segundos1") + segundos2 = m.group("Segundos2") + letra1 = m.group("Letra1") + letra2 = m.group("Letra2") + + latitud = gradoDecimal(grados1,minutos1,segundos1) + longitud = gradoDecimal(grados2,minutos2,segundos2) + signo1 = letraSigno(letra1) + signo2 = letraSigno(letra2) -def gradoDecimal(grados,minutos,segundos): - a = float(segundos)/3600 + float(minutos)/60 + float(grados) - return a + else: # formato 1 + signo1 = m.group("Signo1") + latitud = float(m.group("Coord1")) + signo2 = m.group("Signo2") + longitud = float(m.group("Coord2")) + if signo1 == '-': + latitud *= -1 -def validarCoordenada(cadena, form): - if P.fullmatch(cadena): - M = P.fullmatch(cadena) - if M.group("Grados1"): - grados1 = M.group("Grados1") - grados2 = M.group("Grados2") - minutos1 = M.group("Minutos1") - minutos2 = M.group("Minutos2") - segundos1 = M.group("Segundos1") - segundos2 = M.group("Segundos2") - letra1 = M.group("Letra1") - letra2 = M.group("Letra2") - num1 = gradoDecimal(grados1,minutos1,segundos1) - num2 = gradoDecimal(grados2,minutos2,segundos2) - if letra1 == 'N': - simb1 = '+' - else: - simb1 = '-' - if letra2== 'E': - simb2 = '+' - else: - simb2 = '-' - else: - num1 = float(M.group("Coord1")) - num2 = float(M.group("Coord2")) - simb1 = M.group("Signo1") - simb2 = M.group("Signo2") + if signo2 == '-': + longitud *= -1 - if form == 1: - return f'{simb1}{round(num1,4)}, {simb2}{round(num2,4)}' - elif form == 2: - grados1, minutos1, segundos1= decimalGrado(num1) - grados2, minutos2, segundos2 = decimalGrado(num2) - if simb1 == '+': - letra1 = 'N' - else: - letra1 = 'S' - if simb2 == '+': - letra2 = 'E' - else: - letra2 = 'W' - return f'{grados1}º {minutos1}\' {segundos1:}.0000" {letra1}, {grados2}º {minutos2}\' {segundos2}.0000" {letra2}' - elif form == 3: - grados1, minutos1, segundos1 = decimalGrado(num1) - grados2, minutos2, segundos2 = decimalGrado(num2) - if simb1 == '+': - letra1 = 'N' - else: - letra1 = 'S' - if simb2 == '+': - letra2 = 'E' - else: - letra2 = 'W' - return f'{grados1:0>3}{minutos1:0>2}{segundos1:0>2}.0000{letra1}{grados2:0>3}{minutos2:0>2}{segundos2:0>2}.0000{letra2}' + return { + 'latitud': latitud, + 'longitud': longitud + } - else: - return None - -def validarEntrada(entrada): - telefono, dni, fecha, coordenadas, producto, coste = entrada.split(";") - tel = validarTelefono(telefono.strip()) - dni = validarDni(dni.strip()) - fecha = validarInstante(fecha.strip()) - coordenadas = validarCoordenada(coordenadas.strip(), 1) - - valores = { - 'telefono': tel, - 'dni': dni, - 'fecha': fecha, - 'coordenadas': coordenadas, - 'producto': producto, - 'coste': coste, - } - for k in valores.keys(): - if valores[k] is None: - return None - return valores \ No newline at end of file + else: + return None \ No newline at end of file diff --git a/proyecto/variables.py b/proyecto/variables.py index f61cb2b..69c9a1d 100644 --- a/proyecto/variables.py +++ b/proyecto/variables.py @@ -8,7 +8,7 @@ reemplazo_nie = { } meses = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'] -t = r"(?P\+[0-9]+)? *(?P\d{3})-(?P\d{3})-(?P\d{3})" +t = r"((?P\+[0-9]+)? *(?P\d{3})-(?P\d{3})-(?P\d{3}))|((?P\d{3}) *(?P\d{3}) *(?P\d{3}))|( *\+(?P(\d *){10,15}))" T = re.compile(t) d = r"(((?P[X-Z])*(?P\d{7}))|(?P\d{8}))-(?P[A-HJ-NP-TV-Z])" # cambiar, el nie son 7 diff --git a/sesion6.py b/sesion6.py index 85bd44d..28280e2 100644 --- a/sesion6.py +++ b/sesion6.py @@ -134,7 +134,7 @@ def main(): print(validarDni("Z9876543-A")) print(validarInstante("october 12, 1925 1:12 pm")) coord() - l = open("log.txt", encoding="utf-8") + l = open("proyecto/log.txt", encoding="utf-8") for linea in l.readlines(): print(validarEntrada(linea.strip()))