0

Quisiera saber si me pueden guiar en como puedo dar formato a un archivo que tiene lo siguiente.

Tengo una lista como sigue:

lista = ["/B/2_DAM/A/2_MSF/B/1_NAN",
         "/A/2_DAM/A/1_DNA/A/5_DST/A/1_DVC/A/2_MCH/A/1_NAN",
         "/A/6_DAM/A/2_DNA/A/1_DVC/A/5_MCH/A/1_MSF/A/1_NAN/O/3_NN",
         "/A/3_DAM/A/1_DNR/A/2_DVC/A/3_MRM/A/6_NAN",
         "/O/5_DBU/A/1_DRO/A/3_DVC/A/3_NAN/O/1_NN",
         "/A/3_DAM/A/1_DBU/A/1_DNA/A/1_DNR/A/1_DVC/A/4_MRM/A/2_NVD/A/1_LMVM",
         "/B/4_DAM/A/3_MCH/A/1_MRM/A/5_LMVM/B/1_NAN/O/2_NN",
         "/A/2_DRO/A/3_DST/A/4_NAN",
         "/B/4_DAM/A/2_DVC/A/2_MRM/A/2_MSF/B/1_DPV/B/1_MHU",
         "/A/2_DRO/A/2_DVC/A/4_MCH/A/1_MRM/A/2_NAN/O/1_NN"
         ]

Donde

A/B/O = servicio,

DRO/ DVC (etc) = resultado,

# (1 u 2, etc) = veces que se repite el resultado,

ejemplo /B/4_DAM.

Lo que necesito hacer es por cada /B/4_DAM debo separar cada campo, contar el número de veces que se repite el servicio (A o B u O) en cada registro y ordenarlos de la siguiente manera: /servicio/#veces_resultado/.

Pero si en un registro se repite el servicio, es decir se repite una A debo solo ponerla una vez al inicio y poner el numero de veces que se repite cada resultado en orden ascendente, ejemplo:

Tengo:

/B/4_DAM/A/3_MCH/A/1_MRM/A/5_LMVM/B/1_NAN/O/2_NN

Y debe quedar:

/A/1_MRM/3_MCH/5_LMVM/B/1_NAN/4_DAM/O/2_NN

Ojalá puedan ayudarme. De antemano agradezco su tiempo.

Esto es lo que llevo:

final_list = []
reccnt = 0
errcnt = 0

for line in input_lines:
  reccnt += 1

  if errcnt > 10:
    logging.error("Too many record failures")
    sys.exit("Too many record failures")
  try:
    if reccnt % 5000 == 1 and reccnt > 1:
      logging.debug(str(reccnt - 1) + " processed")
      line = line.rstrip("\n")
      tramo1 = line[0:28]
      dia = line[28:30]
      tramo2 = line[30:48]
      tipoServ = line[48:50]
      poscF_lista = line.find("/")
      lista = line[50:poscF_lista]
      tramo3 = line[poscF_lista:].strip()

      num_vecesDiag = tramo3.count("/")
      num_servicios = num_vecesDiag / 2
      num_vecesA = tramo3.count("A/")
      num_vecesB = tramo3.count("B/")
      num_vecesO = tramo3.count("O/")


      if num_vecesB != 0 and num_vecesA == 0 and num_vecesO == 0:
        tipoServ = "OB"
      else:
        tipoServ = "OC"


      if num_vecesA >= 1 and num_vecesB == 0 and num_vecesO == 0:
        outrec = "".join([tramo1, dia, tramo2, tipoServ, lista, tramo3, filler10])




      if len(outrec) < 251:
        long = 250 - len(outrec)
        filler10 = " " * long
        outrec += "".join([filler10])
        outrec += "\n"
        final_list.append(outrec)

  except:
    logging.error("Problem processing upload record")
    logging.error(str(sys.exc_info()[1]))
    logging.warning(line)

  errcnt += 1
  continue
RodrigoN
  • 886
  • 7
  • 16
Yaz Lara
  • 1
  • 2
  • Publicar tu avance, qué es lo que tienes, para ayudarte sobre eso. – Ali May 01 '19 at 05:00
  • Honestamente de esta parte no tengo avance aún... no se me ocurre cómo... pero te dejo lo que llevo: – Yaz Lara May 01 '19 at 05:27
  • no me deja poner todo el código que llevo aquí.. me puedes dar un correo y te lo mando?.. por favor.. – Yaz Lara May 01 '19 at 05:33
  • Eso no está permitido en las reglas, edita tu pregunta. – Ali May 01 '19 at 06:03
  • Discúlpame no lo sabía.. ya edite mi pregunta.. – Yaz Lara May 02 '19 at 14:51
  • Yaz, podrías aclarar la utilidad de la línea **if reccnt % 5000 == 1 and reccnt > 1:** ? Por lo que veo, sólo se ejecutará el código si es que se está leyendo el elemento número 5001, 10001, etcétera, de la lista. Pero no me queda claro cual es el motivo. – RodrigoN May 06 '19 at 19:17

0 Answers0