Autor Tema: Búsqueda compuesta en lista.  (Leído 5261 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Búsqueda compuesta en lista.
« en: 11 de Diciembre de 2021, 16:13:25 »
Hola gente linda, que tengan todos un muy buen Sábado.
Les cuento lo que me trae por estos lares:

Citar
00010 - 01/12/2021 - Medidor EPE - 13098 - 8
00011 - 02/12/2021 - Medidor EPE - 13105 - 7
00012 - 03/12/2021 - Medidor EPE - 13110 - 5
00013 - 04/12/2021 - Medidor EPE - 13117 - 7
00014 - 05/12/2021 - Medidor EPE - 13125 - 8
00015 - 06/12/2021 - Medidor EPE - 13132 - 7
00016 - 07/12/2021 - Medidor EPE - 13138 - 6
00017 - 08/12/2021 - Medidor EPE - 13146 - 8
00018 - 09/12/2021 - Medidor EPE - 13153 - 7
00019 - 10/12/2021 - Medidor EPE - 13159 – 6


Código: Python
  1. import buscar
  2.  
  3. _buscar = input("\n Ingrese busqueda...: ")
  4. print()
  5.  
  6. encontrados = buscar.encontrar(_buscar)
  7.  
  8. if len(encontrados):
  9.     for enc in encontrados:
  10.         print('' ,enc)
  11. else:
  12.     print("\n No hubo coincidencias...")


Código: Python
  1. import codecs
  2. import re
  3.  
  4. def encontrar(buscar):
  5.     encontrados = []
  6.     with codecs.open('agenda_prac.txt', 'r', encoding='utf-8') as archivo:
  7.         for linea in archivo:
  8.             if re.search(buscar, linea, re.IGNORECASE):
  9.                 linea = linea.strip()
  10.                 encontrados.append(linea)
  11.  
  12.     return encontrados
Este es un primer filtro pero podrían aparecer ciento de registros quiero con esto que esta dentro de una lista realizar otra búsqueda x ej. con un rango de fecha, del 03/12/2021 al 08/12/2021, ¿me podrían dar algún ej. de como hacerlo? Si es mucho código por lo menos un poco de teoría.-
Desde ya muchas gracias, Daniel.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Búsqueda compuesta en lista.
« Respuesta #1 en: 11 de Diciembre de 2021, 16:29:26 »
Hola Daniel. No entiendo bien qué es lo que quieres hacer. Sé que quieres buscar algo, pero no sé cual es la salida que esperas obtener.

Un saludo.

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Búsqueda compuesta en lista.
« Respuesta #2 en: 11 de Diciembre de 2021, 16:46:47 »
Hola Picuino ¿Cómo estas?, que la próxima búsqueda de como resultado esto x ej.:

Citar
00014 - 05/12/2021 - Medidor EPE - 13125 - 8
00015 - 06/12/2021 - Medidor EPE - 13132 - 7
00016 - 07/12/2021 - Medidor EPE - 13138 - 6

El caso es que la búsqueda puede dar como resultado ciento o miles de registros x lo tanto hay que achicarla, te dejo lo que estoy agregando para ver si me logras entender.-

Código: Python
  1. import buscar
  2.  
  3. _buscar = input("\n Ingrese busqueda...: ")
  4. print()
  5.  
  6. encontrados = buscar.encontrar(_buscar)
  7.  
  8. if len(encontrados):
  9.     for enc in encontrados:
  10.         print('' ,enc)
  11.     print("""\n    Si la búsqueda contiene demasiados registros puede intentar
  12.    una nueva por ejemplo por el campo fecha o la última columna""")
  13.     SiNo = input("\n    Desea hacer una nueva búsqueda Si/No...: ")
  14.     if SiNo.lower() == 'si':
  15.         print('\n Intentemoslo...')
  16. else:
  17.     print("\n No hubo coincidencias...")
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Búsqueda compuesta en lista.
« Respuesta #3 en: 12 de Diciembre de 2021, 06:58:12 »
El caso es que hay varias maneras de conseguirlo. La más sencilla es sin separar la fecha de los demás campos y sin convertirla

En buscar tienes que introducir la cadena "0[567]/12/2021" y te encontrará los registros que posteas.

Un saludo.

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Búsqueda compuesta en lista.
« Respuesta #4 en: 12 de Diciembre de 2021, 11:03:18 »
Hola Picuino, buen día, sos un genio de las expresiones regulares y todo en Python pero esto me parece
que no me va a funcionar (perdón por ser prejuicioso).-
Creo entender que esto es lo que propones:

Código: Python
  1. import re
  2. archivo = ['00014 - 05/12/2021 - Medidor EPE - 13125 - 8',
  3.            '00015 - 06/12/2021 - Medidor EPE - 13132 - 7',
  4.            '00016 - 07/12/2021 - Medidor EPE - 13140 - 8',
  5.            '00017 - 08/12/2021 - Medidor EPE - 13146 - 6',
  6.            '00018 - 09/12/2021 - Medidor EPE - 13153 - 7',
  7.            '00019 - 10/12/2021 - Medidor EPE - 13160 - 7',
  8.            '00020 - 11/12/2021 - Medidor EPE - 13169 - 9'
  9.            ]
  10.  
  11. #fecha1 = input('\n Fechas inicio (00/00/0000)...: ')
  12. #fecha2 = input('\n Fechas final  (00/00/0000)...: ')
  13.  
  14. buscar = re.compile(r'0[5-7]/12/2021')
  15.  
  16. for linea in archivo:
  17.     if re.search(buscar, linea):
  18.         print(linea)

Decime ¿esto no es posible, estoy en lo cierto?, lo que ocurre es que el ingreso de la búsquedas es x teclado, tu me dirás, sigo investigando.

Código: Python
  1. f1=7
  2. f2=8
  3. buscar = re.compile(r'0[f1-f2]/12/2021')


Que tengan vos y todos los que te lean un bello Domingo, slds. Daniel.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Búsqueda compuesta en lista.
« Respuesta #5 en: 12 de Diciembre de 2021, 11:10:49 »
Aunque el ingreso de la cadena de búsqueda sea por teclado, igualmente va a funcionar tal y como lo tenías programado antes.


Código: Python
  1. import re
  2. archivo = ['00014 - 05/12/2021 - Medidor EPE - 13125 - 8',
  3.            '00015 - 06/12/2021 - Medidor EPE - 13132 - 7',
  4.            '00016 - 07/12/2021 - Medidor EPE - 13140 - 8',
  5.            '00017 - 08/12/2021 - Medidor EPE - 13146 - 6',
  6.            '00018 - 09/12/2021 - Medidor EPE - 13153 - 7',
  7.            '00019 - 10/12/2021 - Medidor EPE - 13160 - 7',
  8.            '00020 - 11/12/2021 - Medidor EPE - 13169 - 9'
  9.            ]
  10.  
  11. buscar = input("Ingrese búsqueda...: ")
  12.  
  13. for linea in archivo:
  14.     if re.search(buscar, linea):
  15.         print(linea)


Salida:
Código: [Seleccionar]
Ingrese búsqueda...: 0[567]/12/2021
00014 - 05/12/2021 - Medidor EPE - 13125 - 8
00015 - 06/12/2021 - Medidor EPE - 13132 - 7
00016 - 07/12/2021 - Medidor EPE - 13140 - 8
>>>

Saludos y buen domingo.

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Búsqueda compuesta en lista.
« Respuesta #6 en: 12 de Diciembre de 2021, 11:38:52 »
Gracias, No me hagas mucho caso porque tengo un barullo importante en el bocho
y para mejor es Domingo y estarás descansando.-
El asunto pasa porque la búsqueda se refiere a un rango de fecha, si seria 1 sola todo
es sencillo pero la búsqueda tiene 2 fechas, inicio y final, pero igual y si bien todavía
no logro llevarlo a la practica la idea la tengo, nos leemos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Búsqueda compuesta en lista.
« Respuesta #7 en: 12 de Diciembre de 2021, 14:56:37 »
En ese caso tienes que convertir la fecha en una cadena que se pueda comparar con mayor y menor que.

Lo más sencillo es cambiar el orden de los elementos de la fecha:
   05/12/2021 --> 2021/12/05

Código: Python
  1. import re
  2.  
  3. def fecha(linea):
  4.     fecha = re.split(' - ', linea)[1]
  5.     campos = re.split('/', fecha)
  6.     return f"{campos[2]}/{campos[1]}/{campos[0]}"
  7.  
  8. archivo = """00010 - 01/12/2021 - Medidor EPE - 13098 - 8
  9. 00011 - 02/12/2021 - Medidor EPE - 13105 - 7
  10. 00012 - 03/12/2021 - Medidor EPE - 13110 - 5
  11. 00013 - 04/12/2021 - Medidor EPE - 13117 - 7
  12. 00014 - 05/12/2021 - Medidor EPE - 13125 - 8
  13. 00015 - 06/12/2021 - Medidor EPE - 13132 - 7
  14. 00016 - 07/12/2021 - Medidor EPE - 13138 - 6
  15. 00017 - 08/12/2021 - Medidor EPE - 13146 - 8
  16. 00018 - 09/12/2021 - Medidor EPE - 13153 - 7
  17. 00019 - 10/12/2021 - Medidor EPE - 13159 - 6"""
  18.  
  19. fecha_inicio = input("Ingrese fecha de inicio (aaaa/mm/dd): ")
  20. fecha_fin = input("Ingrese fecha final     (aaaa/mm/dd): ")
  21. lineas = re.split('\n', archivo)
  22. for linea in lineas:
  23.     if fecha(linea) >= fecha_inicio and fecha(linea) <= fecha_fin:
  24.         print(linea)


Salida:
Código: [Seleccionar]
Ingrese fecha de inicio (aaaa/mm/dd): 2021/12/04
Ingrese fecha final     (aaaa/mm/dd): 2021/12/07
00013 - 04/12/2021 - Medidor EPE - 13117 - 7
00014 - 05/12/2021 - Medidor EPE - 13125 - 8
00015 - 06/12/2021 - Medidor EPE - 13132 - 7
00016 - 07/12/2021 - Medidor EPE - 13138 - 6
>>>


Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Búsqueda compuesta en lista.
« Respuesta #8 en: 12 de Diciembre de 2021, 17:21:19 »
Estaba embalado y todavía no vi tu versión, luego de que mi querido Newell’s
gane el partido lo voy a analizar.
En el mío tengo una duda.
Código: Python
  1. fecha_str = linea[8:18]

¿Qué pasa si la fecha es = 5/12/2021?, tal vez al grabar en el archivo el
programa agregue el cero.-
Gracias, muchas gracias Piculino.

Código: Python
  1. from datetime import datetime
  2. import re
  3.  
  4. archivo = ['00014 - 05/12/2021 - Medidor EPE - 13125 - 8',
  5.            '00015 - 06/12/2021 - Medidor EPE - 13132 - 7',
  6.            '00016 - 07/12/2021 - Medidor EPE - 13140 - 8',
  7.            '00017 - 08/12/2021 - Medidor EPE - 13146 - 6',
  8.            '00018 - 09/12/2021 - Medidor EPE - 13153 - 7',
  9.            '00019 - 10/12/2021 - Medidor EPE - 13160 - 7',
  10.            '00020 - 11/12/2021 - Medidor EPE - 13169 - 9'
  11.            ]
  12.  
  13.  
  14. while True:
  15.     f1 = input('\n Fechas inicio, formato(dd/mm/aaaa)...: ')
  16.     try:
  17.         fecha_inicio = datetime.strptime(f1, '%d/%m/%Y')
  18.     except ValueError:
  19.         print("\n No ha ingresado una fecha correcta...")
  20.     else:
  21.         break
  22.    
  23. while True:
  24.     f2 = input('\n Fechas final, formato(dd/mm/aaaa)....: ')
  25.     try:
  26.         fecha_fin = datetime.strptime(f2, '%d/%m/%Y')
  27.     except ValueError:
  28.         print("\n No ha ingresado una fecha correcta...")
  29.     else:
  30.         break
  31.  
  32. if fecha_inicio > fecha_fin:
  33.     tmp = fecha_inicio
  34.     fecha_inicio = fecha_fin
  35.     fecha_fin = tmp
  36.  
  37. for linea in archivo:
  38.     fecha_str = linea[8:18]
  39.     fecha = datetime.strptime(fecha_str, '%d/%m/%Y')
  40.     if fecha >= fecha_inicio and fecha <= fecha_fin:
  41.         print(linea)
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Búsqueda compuesta en lista.
« Respuesta #9 en: 13 de Diciembre de 2021, 05:36:01 »
Con este cambio en el programa, se rellena con ceros a la izquierda los números del 1 al 9 en días y meses:

Código: Python
  1. def fecha(linea):
  2.     fecha = re.split(' - ', linea)[1]
  3.     campos = re.split('/', fecha)
  4.     return f"{campos[2]}/{campos[1]:0>2}/{campos[0]:0>2}"

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Búsqueda compuesta en lista.
« Respuesta #10 en: 13 de Diciembre de 2021, 12:55:13 »
Sos un genio, era lo que me faltaba, gracias y a continuar picando código.-
Esto es lo que tenia completando la fecha con tu código me aseguro de no
fallar en la búsqueda.-

Código: Python
  1. codigo = '00012'
  2. fecha = '05/12/2021'
  3. detalle = 'compras en el super'
  4. varios = '923.50'
  5.  
  6.  
  7. final = f'{codigo:5} - {fecha:10} - {detalle:50} - {varios:>10}'

Desde ya que todos estos datos se reemplazan con ingreso x teclado.
Abrazo desde Argentina.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Búsqueda compuesta en lista.
« Respuesta #11 en: 14 de Diciembre de 2021, 16:32:10 »
Muchas gracias, Daniel, pero no es para tanto.
Aquí puedes leer más sobre el formateo de texto:
https://docs.python.org/es/3.10/library/string.html#formatspec

Un saludo.


 

anything