entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

Depurar un txt con PHP a partir de datos de SQL Server

Hola a todos, tengo una duda enorme y no tengo ni idea de como empezar, si alguien me puede asesorar un poco, se lo voy agradecer mucho,
sucede que tengo un archivo txt que tiene varios parametros, este archivo va estar alojado en una carpeta dentro de mi servidor, la cosa es que para el sistema que voy a desarrollar, necesito depurarlo a partir de datos que tenga en SQL server, es decir, que solo tome las lineas donde encuentre el dato que se guarde en SQL, esto para hacerlo dinámico, y se puedan comparar tantos parámetros como se tengan en la base, ya tengo la implementacion para hacer la comparación, lo único que no tengo claro es como depurar el txt para que solo me traiga los parámetros que se tengan en la base.Voy a ocupar PHP, si alguien me puede dar alguna idea, algun ejemplo que me sea de utilidad en serio que lo voy agradecer mucho, de cualquier forma trabajare con esto y en cuanto tenga la solución la voy a compartir. Desde ya muchas gracias

2 Respuestas

4votos

Leonardo-Tadei Puntos227320

Hola @rach,

Tal vez no entienda el problema, pero parece que solamente deberías ir leyendo el archivo, y hacer algo solo cuando encuentre el dato deseado lo guarde en la base de datos.

Sería una comparación del valore leído en el archivo con el valor guardado en la DB, y solo si coinciden se guarden.

Te podríamos ayudar mejor si ponés una parte del archivo TXT para que podamos ver su estructura y si nos dieras un ejemplo de un dato que sería válido para cargar...

Saludos cordiales

0voto

rach comentado

hola @Leonardo-Tadei lo que quiero es que por ejemplo

y ese parametro tengo en mente que se traiga de una bd en sql server, no se si me explico?.... asignarlo a una variable

0voto

Leonardo-Tadei comentado

Hola @rach

no, no te entiendo... poné por favor la porción del TXT que quieras sin agregarle ni sacarle nada, y luego más abajo escribí cuál sería el valor o los valores que querés leer.

Al modificar el texto original con tus comentarios se modifica la estructura!

0voto

rach comentado

hola @Leonardo-Tadei

yo quiero depurar ese txt de arriba quitandole todos los valores que no necesito, por ejemplo, en este caso solo quiero el parametro que se llama userLabel, pero dicho parametro o valor o lo que sea va venir de la bd para que asi puedan elegir mas parametros a comparar, esto para hacerlo mas dinamico y que se puedan comparar tantos como se vayan agregando, ya que como lo mencione al principio, lo que quiero es quitar todo lo que no me sirve del txt para despues compararlo, no se si me doy a entender

muchas gracias por responder y por la ayuda

0voto

Leonardo-Tadei comentado

Hola @rach,

el archivo es un texto plano con los datos ancho fijo.
Desde PHP, lo podés leer con file(), que te devolverá un vector en que cada elemento es una línea.

Luego, se busca la cadena que te interesa para analizar la línea; los datos empiezan en la posición 38 si no estoy contando mal. La función substr() te devuleve una porción del string, que es lo que te interesa analizar.

Más o menos y a mano alzada, quedaría así:

$archivo = 'ruta/al/archivo/para/leer.txt';
$a = file($archivo);
$valor=''
foreach($a as $l){
  $buscar = substr($l,0,11);
  if( $buscar == '- userLabel'){
    $valor = substr($l,38,100);
  }
}
print("Buscando $buscar y encontrado $valor");

Posiblemente las posiciones no sean exactamente estas y las debas ajustar, pero la idea es esta: leer solo lo que te hace falta.

Saludos cordiales

0voto

rach comentado

muchas gracias por tu ayuda @Leonardo-Tadei sin embargo a veces se puede mover la ubicacion entre lineas de los archivos, no es un archivo fijo, dato que me falto mencionar, algunas veces pueden subir unos diferentes pero que contienen el parametro

0voto

Leonardo-Tadei comentado

No importa @rach !

El algoritmo que te propongo recorre siempre todas las líneas, así que no importa la posición en la que esté.

Lo que sí dice la documentación de la central de alarmas Ericson que genera el archivo, es que cada línea tendrá siempre el mismo formato, así que el nombre y la etiqueta empezarán siempre en el mismo lugar...

0voto

rach comentado

hola @Leonardo-Tadei perdona, la verdad no termino de entender muy bien como funciona el algoritmo, pero a que documentacion te refieres?

0voto

Leonardo-Tadei comentado

El algoritmo es nada más que un bucle que busca una cadena de texto entre las líneas de un archivo.

A la documentación que me refiero, es a la de la central de alarmas Ericson que genera el archivo de muestra que pusiste. Ese es el origen del TXT.

2votos

rach comentado

@Leonardo-Tadei como puedo modificar este codigo a la inversa, ahi me borra palabras que especifico en la variable, pero como le hago para que borre todo lo diferente a ese valor

$texto = '';
$cadena_a_borrar = 'rachel';
$nombre_archivo = 'test.txt';
$lineas = file($nombre_archivo);

foreach ($lineas as $linea) {
    if (!strstr($linea, $cadena_a_borrar)) {
        $texto .= $linea;
    }
}

$f = fopen($nombre_archivo, 'w'); 
fwrite($f, $texto); 
fclose($f);

2votos

Leonardo-Tadei comentado

Vas a generar un archivo nuevo? En tu pregunta decías que tenías que cargar los valores encontrados en una DB... en fin.

Para que el archivo resultante quede solo con la palabra buscada, en vez de:

    if (!strstr($linea, $cadena_a_borrar)) {
        $texto .= $linea;
    }

hace:

    if (strstr($linea, $cadena_a_borrar)) {
        $texto .= $linea;
    }

Luego el nombre d ela variable $cadena_a_borrar deja de ser representativo, porque ahora hace lo contrario.

Para el caso de que quieras buscar varias líneas, recordá poner un ENTER al final de cada asignación, así podés volver a leer el archivo fácilmente.

1voto

rach comentado

muchas gracias @Leonardo-Tadei si me funcionó, aunque solo funciona con un valor, necesito que sea mas de uno, voy a tratar de ver como lograrlo, muchas gracias

2votos

Leonardo-Tadei comentado

Me alegro que te haya servido.

Para buscar más valores, o bien definís una variable y un IF por cada valor, o bien cargás en un vector todas las palabras y en cada iteración del bucle buscás el valor en cada línea.

Cómo casi siempre, no hay una sola respuesta válida para un algoritmo!

1voto

rach comentado

hola @Leonardo-Tadei gracias por tu comentario, si lo estoy haciendo con el if, pero no lo veo muy factible por q son 700 las palabras a buscar, estoy pensando la manera de hacerlo como con un arreglo, para que tome todo el listado, aun sigo pensando como hacerlo, pero muchas gracias por contestarme

1voto

bichomen Puntos2770

Un if no, un for o un while, para que recorra las 700 palabras y deberías tener esas palabras en un txt o base de datos, desde donde volcarlas.

1voto

rach comentado

hola @bichomen es la idea que tengo, aunque no se como implementarla con lo que necesito, ya que de la forma que lo tengo, me funciona, que es borrando las lineas diferentes a la coincidencia


$texto = '';
$cadena_a_borrar = 'numEulResources';
$cadena_a_borrar2 = 'numHsCodeResources';
$cadena_a_borrar3 = 'maxNumADchReservation';
$cadena_a_borrar4 = 'dlLicFractBbPool2';
$cadena_a_borrar5 = 'eul2msFirstSchedStep';
$cadena_a_borrar6 = 'eulDchMaxAllowedSchRate';
$cadena_a_borrar7 = 'eulLowRate';
$cadena_a_borrar8 = 'eulMaxAllowedSchRate';
$cadena_a_borrar9 = 'eulMaxShoRate';
$cadena_a_borrar10 = 'eulNonServHwRate';
$nombre_archivo = 'after/before.txt';
$lineas = file($nombre_archivo);

foreach ($lineas as $linea) {
    if (strstr($linea, $cadena_a_borrar2)) {
        $texto .= $linea;
    }
    if (strstr($linea, $cadena_a_borrar)) {
        $texto .= $linea;
    }
    if (strstr($linea, $cadena_a_borrar3)) {
        $texto .= $linea;
    }
    if (strstr($linea, $cadena_a_borrar4)) {
        $texto .= $linea;
    }
    if (strstr($linea, $cadena_a_borrar5)) {
        $texto .= $linea;
    }
    if (strstr($linea, $cadena_a_borrar6)) {
        $texto .= $linea;
    }
    if (strstr($linea, $cadena_a_borrar7)) {
        $texto .= $linea;
    }
    if (strstr($linea, $cadena_a_borrar8)) {
        $texto .= $linea;
    }
    if (strstr($linea, $cadena_a_borrar9)) {
        $texto .= $linea;
    }
    if (strstr($linea, $cadena_a_borrar10)) {
        $texto .= $linea;
    }
}

$f = fopen($nombre_archivo, 'w'); 
fwrite($f, $texto); 
fclose($f);```

3votos

bichomen comentado

Deberías utilizar la función gets()

$file = fopen("1.txt", "r") or exit("Unable to open file!");
//Output a line of the file until the end is reached
while(!feof($file))
{
echo fgets($file). "<br>";
}
fclose($file);

Que recorre un fichero linea por linea.

No se como tendrás montado el txt pero si el string a borrar lo tienes solo en una linea entonces ya lo tienes fácil, pero si esta como has puesto arriba tiene 2 opciones poner un disparador tipo almohadilla (#), por ejemplo, para luego con alguna función de php extraer la cadena a partir de ese disparador o utilizar la variable y aprovechando el for hacer algo por el estilo:

$variable = concat($cadena_a_borrar2 + $i);
$i++;

Con esto te ahorrarías todos los if

1voto

rach comentado

hola @bichomen ya modifiqué un poco el código, ya me borra mas de una palabra sin tanto código, el problema es que, al avanzar se queda en la ultima palabra que encuentra y ya no sigue con las demás posiciones para borrar todo lo diferente a lo que se tiene en el arreglo, va recorriendo el arreglo y si en el caso de que todas las palabras están en el txt, todo lo hace bien pero si solo encuentra hasta la posición 3 y la 4 no esta en el txt ya no continua borrando lo diferente, no se si me explico, dejo mi código, y muchas gracias por tu ayuda


$texto = '';
$cadena_a_borrar = 'numEulResources';
$cadena_a_borrar2 = 'numHsCodeResources';
$cadena_a_borrar3 = 'maxNumADchReservation';
$cadena_a_borrar4 = 'dlLicFractBbPool2';
$cadena_a_borrar5 = 'eul2msFirstSchedStep';
$cadena_a_borrar6 = 'eulDchMaxAllowedSchRate';
$cadena_a_borrar7 = 'eulLowRate';
$cadena_a_borrar8 = 'eulMaxAllowedSchRate';
$cadena_a_borrar9 = 'eulMaxShoRate';
$cadena_a_borrar10 = 'eulNonServHwRate';
$nombre_archivo = 'ejemplo1.txt';
$lineas = file($nombre_archivo);

$vars= array($cadena_a_borrar,$cadena_a_borrar2,$cadena_a_borrar3,$cadena_a_borrar5,$cadena_a_borrar6,$cadena_a_borrar7,$cadena_a_borrar8,$cadena_a_borrar9,$cadena_a_borrar10);

$cont=0;
foreach ($lineas as $linea) {
    if (strstr($linea, $vars[$cont])) {
        $texto .= $linea;
        $cont++;
    }

}

$f = fopen($nombre_archivo, 'w'); 
fwrite($f, $texto); 
fclose($f);

1voto

bichomen comentado

Pues que siga contando filas, algo así:

if (strstr($linea, $vars[$cont])) {
        $texto .= $linea;
        $cont++;
    }
else {
   $cont++;
}

Para que continué con la siguiente fila

1voto

rach comentado

@bichomen probé tu solución pero me borra todas las lineas, queda en blanco totalmente

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta