open($tmp_file, ZipArchive::CREATE) === TRUE) { $main_py = "import lectura as pd_datos\r\ndef menu():\r\n while True:\r\n print(\"\\n---------------------\")\r\n print(\"1.- Montar archivo de datos\")\r\n print(\"2.- Ver estadísticas de oleaje\")\r\n print(\"3.- Mostrar todos los registros\")\r\n print(\"4.- Salir\")\r\n opcion = input(\"Seleccione una opción (1-4): \")\r\n if opcion == \"1\": pd_datos.verificar_y_montar_archivo()\r\n elif opcion == \"2\": pd_datos.obtener_ola_mas_alta()\r\n elif opcion == \"3\": pd_datos.ver_todos_los_registros()\r\n elif opcion == \"4\": break\r\nif __name__ == \"__main__\": menu()"; $lectura_py = "import pandas as pd\r\nimport os\r\ncolumnas = ['Anio','Mes','Dia','Hora','Hm0','Tz','Te','Tm','Tp','Dm','Dp','e','v','Qp','y','s']\r\ndef verificar_y_montar_archivo():\r\n archivo_txt = \"datos.txt\"\r\n if not os.path.exists(archivo_txt): return\r\n df = pd.read_csv(archivo_txt, sep=r'\\s+', skiprows=1, names=columnas, encoding='latin-1', on_bad_lines='skip')\r\n print(f\"Se detectaron {len(df)} registros.\")\r\ndef obtener_ola_mas_alta():\r\n archivo_txt = \"datos.txt\"\r\n df = pd.read_csv(archivo_txt, sep=r'\\s+', skiprows=1, names=columnas, encoding='latin-1', on_bad_lines='skip')\r\n fila_max = df.loc[df['Hm0'].idxmax()]\r\n print(f\"Altura máxima: {fila_max['Hm0']} m\")\r\ndef ver_todos_los_registros():\r\n archivo_txt = \"datos.txt\"\r\n df = pd.read_csv(archivo_txt, sep=r'\\s+', skiprows=1, names=columnas, encoding='latin-1', on_bad_lines='skip')\r\n with pd.option_context('display.max_rows', None): print(df)"; $zip->addFromString('main.py', $main_py); $zip->addFromString('lectura.py', $lectura_py); $zip->close(); header('Content-Type: application/zip'); header('Content-Disposition: attachment; filename="' . $filename . '"'); readfile($tmp_file); unlink($tmp_file); exit; } } // 4. LÓGICA DE PROCESAMIENTO PHP // Detectamos si la petición viene por POST (formulario) o por GET (cambio de página en la paginación) if ($_SERVER['REQUEST_METHOD'] === 'POST' || (isset($_GET['opcion']) && file_exists($archivo_fijo))) { // CASO 1: SUBIR Y MONTAR EL ARCHIVO if ($opcion_activa === '1' && $_SERVER['REQUEST_METHOD'] === 'POST') { if (isset($_FILES['archivo_wave']) && $_FILES['archivo_wave']['error'] === UPLOAD_ERR_OK) { if (move_uploaded_file($_FILES['archivo_wave']['tmp_name'], $archivo_fijo)) { $success_msg = "Archivo '" . htmlspecialchars($_FILES['archivo_wave']['name']) . "' subido y montado correctamente."; } else { $error_msg = "Error interno al intentar guardar el archivo."; } } else { $error_msg = "Por favor, seleccione un archivo válido."; } } // ENFOQUE ANALÍTICO PARA LAS OPCIONES 2 Y 3 if (in_array($opcion_activa, ['2', '3'])) { if (!file_exists($archivo_fijo)) { $error_msg = "No se ha encontrado el archivo montado ('datos.txt'). Use la opción 1 primero."; } else { $fn = fopen($archivo_fijo, "r"); $todos_los_registros = []; $max_hm0 = -1.0; $fila_maxima = null; while (!feof($fn)) { $linea = trim(fgets($fn)); if ($linea === "" || strpos($linea, '%') === 0) { continue; // Saltar cabeceras y líneas vacías } $valores = preg_split('/\s+/', $linea); if (count($valores) >= 5) { $registro = [ 'Anio' => (int)$valores[0], 'Mes' => (int)$valores[1], 'Dia' => (int)$valores[2], 'Hora' => (int)$valores[3], 'Hm0' => (float)$valores[4], 'Tz' => isset($valores[5]) ? (float)$valores[5] : null, 'Te' => isset($valores[6]) ? (float)$valores[6] : null, 'Tm' => isset($valores[7]) ? (float)$valores[7] : null, 'Tp' => isset($valores[8]) ? (float)$valores[8] : null, 'Dm' => isset($valores[9]) ? (float)$valores[9] : null, 'Dp' => isset($valores[10]) ? (float)$valores[10] : null, 'e' => isset($valores[11]) ? (float)$valores[11] : null, 'v' => isset($valores[12]) ? (float)$valores[12] : null, 'Qp' => isset($valores[13]) ? (float)$valores[13] : null, 'y' => isset($valores[14]) ? (float)$valores[14] : null, 's' => isset($valores[15]) ? (float)$valores[15] : null ]; if ($registro['Hm0'] > $max_hm0) { $max_hm0 = $registro['Hm0']; $fila_maxima = $registro; } if ($opcion_activa === '3') { $todos_los_registros[] = $registro; } } } fclose($fn); // Asignación de resultados estructurados if ($opcion_activa === '2') { if ($fila_maxima !== null) { $resultados[] = [ 'Módulo' => 'Ola Más Alta Detectada', 'Altura_Hm0_Metros' => number_format($fila_maxima['Hm0'], 4), 'Fecha_Registro' => $fila_maxima['Dia'] . '/' . $fila_maxima['Mes'] . '/' . $fila_maxima['Anio'], 'Hora_Bloque' => $fila_maxima['Hora'] . ':00 hrs.' ]; } } elseif ($opcion_activa === '3') { // --- PROCESAMIENTO DE LA PAGINACIÓN REAL (MÁXIMO 100 REGISTROS) --- $total_registros = count($todos_los_registros); $total_paginas = ceil($total_registros / $por_pagina); if ($pagina_actual > $total_paginas) $pagina_actual = $total_paginas; // Extraer el trozo (slice) correspondiente a la página activa $inicio_index = ($pagina_actual - 1) * $por_pagina; $resultados = array_slice($todos_los_registros, $inicio_index, $por_pagina); } } } } ?>
No se encontraron registros en el archivo.