terminado

This commit is contained in:
binlaab
2025-12-09 11:09:08 +01:00
parent 1defdd5e6c
commit 77fef039e0
8 changed files with 249 additions and 194 deletions

View File

@@ -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)
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='')

View File

@@ -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>-sphone (?P<telefono>\S*) (?P<fichero>\S*))|(?P<stime>-stime (?P<inicio>\S*) (?P<final>\S*) (?P<fichero1>\S*))|(?P<n>-n (?P<fichero2>\S*))|(?P<snif>-snif (?P<nif>\S*) (?P<fichero3>\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()

View File

@@ -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
if d['mes'].isdigit():
try:
d['mes'] = meses[int(d['mes']) - 1]
except ValueError:
pass
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']} 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='')

83
proyecto/util.py Normal file
View File

@@ -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

View File

@@ -1,33 +1,22 @@
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'),
}
elif match is not None and match['num']:
return {
'num': match.group('num'),
}
else:
return None
def validarDni(dni):
match = D.match(dni)
if match and match['letrainicio']:
@@ -46,6 +35,7 @@ def validarDni(dni):
'numero': match['numero'],
'letrafinal': match.group('letrafinal'),
}
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}'
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,
return {
'latitud': latitud,
'longitud': longitud
}
for k in valores.keys():
if valores[k] is None:
else:
return None
return valores

View File

@@ -8,7 +8,7 @@ reemplazo_nie = {
}
meses = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december']
t = r"(?P<prefijo>\+[0-9]+)? *(?P<parte1>\d{3})-(?P<parte2>\d{3})-(?P<parte3>\d{3})"
t = r"((?P<prefijo>\+[0-9]+)? *(?P<parte1>\d{3})-(?P<parte2>\d{3})-(?P<parte3>\d{3}))|((?P<parte1>\d{3}) *(?P<parte2>\d{3}) *(?P<parte3>\d{3}))|( *\+(?P<num>(\d *){10,15}))"
T = re.compile(t)
d = r"(((?P<letrainicio>[X-Z])*(?P<numero>\d{7}))|(?P<numero>\d{8}))-(?P<letrafinal>[A-HJ-NP-TV-Z])" # cambiar, el nie son 7

View File

@@ -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()))