Extraer empates de archivos masivos con PHP

Clase 24 de 29Curso de Expresiones Regulares

Resumen

Con una combinación de expresiones regulares y un flujo de depuración práctico, se puede transformar un archivo con decenas de miles de partidos en información clara: quién fue local, visitante o si hubo empate, todo alineado y legible. Aquí verás cómo aplicar banderas, ajustar clases de caracteres ante acentos y guiones, y medir tiempos de ejecución para tomar decisiones con datos limpios y bien presentados.

¿Cómo extraer empates con expresiones regulares en PHP?

La idea central es usar un patrón que capture los campos clave y luego operar con esa información. Se parte de una línea correcta como plantilla comentada para iterar más rápido sobre el patrón. Se capturan: fecha completa, equipo local, equipo visitante, goles de local y goles de visitante. Con esa base, se filtran los empates o se etiqueta el resultado como local o visitante.

¿Qué capturas y estructura usa el patrón?

  • Primer grupo: fecha completa de la línea.
  • Segundo grupo: equipo local.
  • Tercer grupo: equipo visitante.
  • Cuarto grupo: goles del local.
  • Quinto grupo: goles del visitante.

¿Qué aporta la bandera i al match?

  • Activa modo case insensitive para evitar problemas con mayúsculas y minúsculas.
  • Se coloca al final del patrón: la i después del último slash.
  • Reduce la necesidad de duplicar rangos A–Z y a–z.

¿Cómo manejar espacios, guiones y acentos en nombres?

  • Los nombres de países incluyen espacios y guiones: se ajusta la clase de caracteres para contemplarlos.
  • Surgen “caracteres raros” como acentos o puntos: São Tomé, Curazao, Saint Kitts.
  • Una salida rápida es cambiar a .+ para abarcar variantes, entendiendo el riesgo de cortar a través de la coma.
  • La ancla en los dos dígitos del marcador ayuda a mantener el patrón estable, incluso con un campo como friendly al final.
<?php // Ejemplo de lógica de resultado basada en capturas previas ($m2..$m5): if ($m4 == $m5) { echo "empate\t"; } elseif ($m4 > $m5) { echo "local \t"; // dos espacios extra para mostrar alineación. } else { echo "visitante\t"; } printf("%s, %s %d-%d\n", $m2, $m3, $m4, $m5);

¿Cómo depurar errores de match sin frustración?

Entender una expresión regular a la primera no es realista. La estrategia efectiva: comentar la impresión de aciertos e imprimir solo las líneas que no hacen match. Así se detectan rápido ausencias de espacios, guiones o puntos.

¿Qué estrategia acelera la corrección del patrón?

  • Comentar la salida de aciertos y mostrar únicamente fallos.
  • Revisar visualmente qué rompe el patrón: espacios, guiones, puntos o tildes.
  • Ajustar la clase de caracteres, reejecutar y verificar el conteo.

¿Qué señales dieron los conteos intermedios?

  • Un conteo parcial grande al inicio evidenció que el patrón cortaba mal.
  • Con espacios y guiones en la clase, el conteo bajó a 10646.
  • Luego a 907, revelando acentos y puntos no contemplados.
  • Tras ampliar a .+, quedaron solo dos líneas problemáticas (una en blanco), con el resto correcto.

¿Qué diferencias notar con Perl al leer líneas?

  • Aquí no se aplicó chomp como en Perl: las líneas en blanco pueden colarse.
  • Ajustar el manejo de fin de línea según la consola y el entorno.

¿Cómo presentar y medir resultados para lectura rápida?

La presentación importa. Se etiqueta el resultado con texto natural y se alinea con tab para lectura ágil. Separar los equipos con coma evita confusiones. Finalmente, se mide el tiempo total para evaluar rendimiento.

¿Cómo generar etiquetas legibles a partir de datos?

  • Comparar goles: si m4 == m5, imprimir empate; si m4 > m5, local; en otro caso, visitante.
  • Usar printf para un formato consistente: Equipo local, Equipo visitante marcador.
  • Añadir una coma entre equipos para claridad.
<?php // Etiquetado y salida legible. if ($m4 == $m5) { echo "empate\t"; } elseif ($m4 > $m5) { echo "local\t"; } else { echo "visitante\t"; } printf("%s, %s %d-%d\n", $m2, $m3, $m4, $m5);

¿Qué hace el tabulador en consola?

  • El tab avanza al siguiente múltiplo fijo, típicamente 8 espacios.
  • Alinea columnas aunque las etiquetas tengan longitudes distintas.
  • La visualización mejora y la lectura es inmediata.

¿Cuánto tarda y por qué importa?

  • Medir con time antes y después del proceso.
  • En la práctica, leer el archivo tomó cerca de 1 segundo, incluso imprimiendo.
  • Separar por comas en arreglos puede tardar 3–4 segundos con 30–40 mil líneas.
  • Las expresiones regulares, cercanas al procesador, suelen ser más rápidas para este patrón.
<?php $t = time(); // ... procesamiento y salida ... printf("tiempo: %d\n", time() - $t);

¿Tú cómo modelarías el patrón para cubrir acentos y puntos sin caer en .+? Comparte tu enfoque y pruebas de rendimiento.