0 votos

Buenas, tengo un archivo de texto con datos, cada dato de cliente es separado por un caracter especifico, por lo tanto divido por cliente, para la busqueda dentro de un cliente por numero de codigo lo busco en la linea especifica, necesito hacer el mismo ordenamiento pero segun otro txt donde estan los mismos codigos pero en otro orden, la necesidad es ordenar  de acuerdo al orden del otro txt que contiene los codigos de cada cliente. adjunto el codigo. gracias

import sys
import os, re, io

excel_path = 'C:\\2 semestre\\cod_clientes.csv'
output_path = 'C:\\2 semestre\\'

def search_for_id(id):
    global _cache_excel
    if '_cache_excel' not in globals():
        import pyodbc
        conn = pyodbc.connect(
            "Driver={Microsoft Excel Driver (*.xls)}; Dbq=%s" % excel_path,
            autocommit=True)
        cursor = conn.cursor()
        _cache_excel = [str(x[0]).split('.')[0] for x in list(cursor.execute("select * from [hoja1$]"))]
        print (_cache_excel)
    return id in _cache_excel



def cliente_encontrado(p_nro_cuenta, file_path):

    v_encontrado = 0
    with open(file_path, 'r') as archivo_clientes:
        for nro_cuenta in archivo_clientes:
            nro_cuenta = re.sub('[^0-9]','', nro_cuenta)
            if nro_cuenta == p_nro_cuenta:
                print ('Encontrado ' + p_nro_cuenta)
                v_encontrado = 1
                break
    return v_encontrado

# @redirect_to_watch
def main():
    directorio = 'C:\\2 semestre\\'
    for elemento_directorio in os.listdir(directorio):
        url_archivo = os.path.join(directorio, elemento_directorio)
        if os.path.isfile(url_archivo):
            fuente = open(url_archivo, 'r')
            archivo_encontrados = None
            archivo_noencontrados = None

            try:
                documento = []
                i = 0
                nro_cuenta = ''
                while True:
                    linea = fuente.readline()
                    if not linea:
                        break
                    
                    match = re.search('\(nvo_cliente\.jdt\)', linea)
                    if  match:
                        if nro_cuenta != '':
                            #busqueda
                            if cliente_encontrado(nro_cuenta, 'C:\\2 semestre\\clientes.txt') == 1:
                                if archivo_encontrados is None:
                                    archivo_encontrados = open(os.path.join( directorio + '\\encontrados', elemento_directorio) , 'w' )
                                    archivo_encontrados.write('%!\n')
                                    if(documento[0][0:1] != '('):
                                       documento[0] = documento[0][7:]
                                       documento[0] = re.sub('INICIO_LINEA_','INICIO_LINEA', documento[0])
                                archivo_encontrados.write(''.join(documento))
                            else:
                                if archivo_noencontrados is None:
                                    archivo_noencontrados = open(os.path.join( directorio + '\\no-encontrados', elemento_directorio) , 'w')
                                    archivo_noencontrados.write('%!\n')
                                    if(documento[0][0:1] != '('):
                                       documento[0] = documento[0][7:]
                                       documento[0] = re.sub('INICIO_LINEA_','INICIO_LINEA', documento[0])
                                archivo_noencontrados.write(''.join(documento))

                        nro_cuenta = ''
                        i = 0
                        documento = []

                    documento += [linea]
                        
                    match_cuenta = re.search('([\s]+)([0-9]+)$', linea)
                    if i == 7 and match_cuenta:
                        nro_cuenta = match_cuenta.group(2)
                        print ('Cuenta en texto: ',match_cuenta.group(2))
                        
                    i += 1 

                if nro_cuenta != '':
                    #busqueda
                    if cliente_encontrado(nro_cuenta, 'C:\\2 semestre\\clientes.txt') == 1:
                        if archivo_encontrados is None:
                            archivo_encontrados = open(os.path.join( directorio + '\\encontrados', elemento_directorio) , 'w' )
                            archivo_encontrados.write('%!\n')
                            if(documento[0][0:1] != '('):
                                documento[0] = documento[0][7:]
                                documento[0] = re.sub('INICIO_LINEA_','INICIO_LINEA', documento[0])
                        archivo_encontrados.write(''.join(documento))
                    else:
                        if archivo_noencontrados is None:
                            archivo_noencontrados = open(os.path.join( directorio + '\\no-encontrados', elemento_directorio) , 'w')
                            archivo_noencontrados.write('%!\n')
                            if(documento[0][0:1] != '('):
                                documento[0] = documento[0][7:]
                                documento[0] = re.sub('INICIO_LINEA_','INICIO_LINEA', documento[0])
                        archivo_noencontrados.write(''.join(documento))

                
            finally:
                fuente.close()
                if not archivo_encontrados is None:
                    archivo_encontrados.close()
                if not archivo_noencontrados is None:
                    archivo_noencontrados.close()
    print ('final del proceso')
                
main()

 

preguntado por Oscar Cabrera Abr 5 en Python

1 Respuesta

0 votos

Buenas Oscar.

Podrías agrupar las líneas del primer fichero con las claves del segundo que es el que quieres ordenar.

Puedes utilizar un OrderDict (o dict desde Python 3 que ya conserva el orden) para guardar las claves que serán los valores del fichero que definirá el orden. Luego puedes recorrer el fichero que quieres ordenar con las claves previas, y los vas acumulando en listados dentro de cada clave que definirá su orden. De este modo tendrás agrupadas las líneas en cada clave que definirá su orden y solo te quedará recorrer las claves con sus conjuntos de líneas.

Dicho de otra manera, en seudo-código:

# Recorrer fichero de orden para guardarlos como claves del diccionario
# Recorrer fichero de líneas a ordenar y guardar cada línea en su clave


# El diccionario resultante con las claves del fichero de orden, y de valores un listado con las líneas del otro fichero agrupadas
dict_orden = {
    "A valor_fichero_orden" = ["línea del fichero que ordenar 1 (contiene 'A valor_fichero_orde')",
                             "línea del fichero que ordenar 2 (contiene 'A valor_fichero_orde')"],
    "B valor_fichero_orden" = ["línea del fichero que ordenar 3 (contiene 'B valor_fichero_orde')",
                             "línea del fichero que ordenar 4 (contiene 'B valor_fichero_orde')"]
    # ...
}
    
# Recorrer ordenado las líneas
for clave, list_lineas in dict_orden.items():
    for linea in list_lineas:
        print("linea ordenada: {}".format(linea))

 

respondido por Ramon [Admin] hace 4 días