Recolección de datos de archivo .txt con php

Necesito que me ayudes.
Lo que pasa es que anteriormente ya me habías apoyado en la forma de como leer un archivo .txt y guardarlo los datos en un arreglo, que funciona perfectamente.
Ahora lo que pasa es que en mi archivo .txt recibo 5 datos obligatorios que los guarda en una arreglo por que están en la misma linea.
Pero de ahí vienen bloques de equipos de 4 datos, por ejemplo: nombre, marca, vida útil, observaciones, pero es dinámico por que se pueden generar N bloques de equipos, dependiendo de una interfaz anterior que genera la plantilla en html y la platilla genera el archivo .txt.
Ahora el problema que tengo es que necesito guardar los datos de los equipos en un arreglo de variables variables para no generar tanto código.
Por ejemplo:
$linea = fgets($file);
$equipo = explode(";", $linea);
Eso es lo que hago para leer una linea en el archivo .txt.
Pero como le hago para genera que en el arreglo $equipo se cree otro arreglo con la variable $nombre y ahí se guarden todos los nombre de los equipos depedendiendo de los que hayan sido y luego otra con el nombre $marca que guarde todas las marcas de los equipos y así de la misma manera con los demás.

1 Respuesta

Respuesta
1
Entiendo que la línea tiene un número indeterminado de grupos de 4 elementos. Si es así, puede hacerse por ejemplo:
$equipo = explode(";", $linea);
for ($i=0, $j=0; $i<count($equipo); $i += 4, j++) {
  $nombre[$j] = $equipo[$i];
  $marca[$j] = $equipo[$i + 1];
  $vidautil[$j] = $equipo[$i + 2];
  $obs[$j] = $equipo[$i + 3];
}
Hola amigo disculpa que te vuelva a molestar pero es que me marca error mira esto es lo que tengo en archivo .txt las lineas solamente son ejemplo de símbolo de enter:
Patito;25 sur;Puebla;Puebla;México;69004734;Karen Guadalupe;[email protected]
--------------------
TransPot-5-69-23-350-150/C1-A-A1;Sony;30;30,000;xxxxxxxxxxxxxxxxx;Interruptores-5-69-23-350-150/C1-A-A1;Panasonic;20;20,000;yyyyyyyyyyyyyy;Cuchillas-5-69-23-350-150/C1-A-A1;Vaio;10;10,000;zzzzzzzzzzzzzzzzz
--------------------
60,000
La segunda fila es la que es dinámica por que pueden ser pocos o muchos equipos con bloques de carcateriticas de 5 datos.
Así tengo mi código:
<?php
// abriendo el archivo de texto que se encuentra en el mismo directorio
//que los archivos html y php
$file = fopen ("c://datos.txt", "r");
$linea = fgets($file);
$datos = explode(";", $linea);
$linea = fgets($file);
$equipo = explode(";", $linea);
for ($i=0,$j=0;$i<count($equipo);$i+=5,j++)
{
$descricpionCorta[$j] = $equipo[$i];
$nombre[$j] = $equipo[$i +1];
$marca[$j] = $equipo[$i + 2];
$vidautil[$j] = $equipo[$i + 3];
$obs[$j] = $equipo[$i + 4];
}
$linea = fgets($file);
$costo = explode(";", $linea);
echo $costo[0];
//Obtenido los datos del archivo cerramos el archivo
fclose ($file);
?>
Pero me marca error, por favor ayudame con este probleimita.
Gracias, saludos
Que onda amigo, nuevamente disculpa que te siga molestando.
Por favor olvida lo anterior por que las cosas ya me las cambiaron un poco, solucione el problema que me marcaba y efectivamente se cumplía lo del problema que te comentaba, pero esta vez tiene que ser al contrario je je. Checa este ejemplo:
$linea = fgets($file);
$equipo = explode(";", $linea);
$j=0;
$x=0;
$i=0;
$variable[$j][$x] = $equipo[$i];
$x++;
$variable[$j][$x] = $equipo[$i + 1];
$x++;
$variable[$j][$x] = $equipo[$i + 2];
$x++;
$variable[$j][$x] = $equipo[$i + 3];
$x++;
$variable[$j][$x] = $equipo[$i + 4];
echo $variable[0][0];
echo '<br>';
echo $variable[0][1];
echo '<br>';
echo $variable[0][2];
echo '<br>';
echo $variable[0][3];
echo '<br>';
echo '<br>';
echo $variable[0][4];
Esto lo hace pero solamente para el primer equipo y sus características osea que ahora en el vector [0] de la posición [0],[1],[2],[3] y [4] se guarda todo lo del primero, eso si lo hace pero solamente para el primero. Como le puedo hacer para los demás y queden de la siguiente forma en el vector [1] de la posición [0],[1],[2],[3] y [4] y así dependiendo del numero de equipos que entren, recuerdas que te había comentado que son dinámicos los bloques.
Gracias y saludos
Sólo tienes que adaptar el código original que te dí:
<?php
// abriendo el archivo de texto que se encuentra en el mismo directorio
//que los archivos html y php
$file = fopen ("c://datos.txt", "r");
$linea = fgets($file);
$datos = explode(";", $linea);
$linea = fgets($file);
$equipo = explode(";", $linea);
for ($i=0,$j=0,$k=0;$i<count($equipo);$i+=5,j++,$k=0)
{
$variable[$j][$k++] = $equipo[$i];
$variable[$j][$k++] = $equipo[$i +1];
$variable[$j][$k++] = $equipo[$i + 2];
$variable[$j][$k++] = $equipo[$i + 3];
$variable[$j][$k++] = $equipo[$i + 4];
}
$linea = fgets($file);
$costo = explode(";", $linea);
echo $costo[0];
//obtenido los datos del archivo cerramos el archivo
fclose ($file);
?>
Hola amigo excelente solución te lo agradezco, pero una ultima pregunta.
Mira en mi archivo .txt ahora aordeno de esta manera los datos:
Patito;25 sur;Puebla;Puebla;México;69004734;Karen Guadalupe;[email protected]
TransPot-5-69-23-350-150/C1-A-A1;Sony;30;30,000;xxxxxxxxxxxxxxxxx
Interruptores-5-69-23-350-150/C1-A-A1;Panasonic;20;20,000;yyyyyyyyyyyyyy
Cuchillas-5-69-23-350-150/C1-A-A1;Vaio;10;10,000;zzzzzzzzzzzzzzzzz 
----------
60,000
Y mi código esta de esta forma:
<?php
$file = fopen ("c://datos.txt", "r");
$linea = fgets($file);
$datos = explode(";", $linea);
$j=0;
$i=0;
while (($linea = fgets($file)) && (fgets($file)!='----------'))
{
$equipo = explode(";", $linea);
$x=0;
$variable[$j][$x] = $equipo[$i];
$x++;
$variable[$j][$x] = $equipo[$i + 1];
$x++;
$variable[$j][$x] = $equipo[$i + 2];
$x++;
$variable[$j][$x] = $equipo[$i + 3];
$x++;
$variable[$j][$x] = $equipo[$i + 4];
$x++;
$variable[$j][$x] = $equipo[$i + 5];
$j++;
}
$costo = explode(";", $linea);
echo $costo[0];
//obtenido los datos del archivo cerramos el archivo
fclose ($file);
?>
Como vez con el while indico que siga leyendo lineas hasta que no se topo con las 10 rayitas(----------) y de ahí se guarde el ultimo dato en un vector diferente.
¿Si hace lo de leer varias lineas y los va guardando sean los que sean pero no se de tiene al encontrar las 10 rayitas(----------) osea que el otro vector no funciona por lo mismo del que while no para como le puedo hacer?
Gracias por toda tu ayuda y disculpa tantas preguntas.
Saludos.
Al final tienes que leer la línea del costo que no la lees, i una vez leída no le tienes que aplicar el explode puesto que la línea sólo tiene un dato. Otro error es que en la línea del while ejecutas fgets dos veces, con lo que pierdes una línea de cada dos:
<?php
$file = fopen ("c://datos.txt", "r");
$linea = fgets($file);
$datos = explode(";", $linea);
$j=0;
$i=0;
$linea = fgets($file);
while ($linea && $linea != '----------')
{
$equipo = explode(";", $linea);
$x=0;
$variable[$j][$x] = $equipo[$i];
$x++;
$variable[$j][$x] = $equipo[$i + 1];
$x++;
$variable[$j][$x] = $equipo[$i + 2];
$x++;
$variable[$j][$x] = $equipo[$i + 3];
$x++;
$variable[$j][$x] = $equipo[$i + 4];
$x++;
$variable[$j][$x] = $equipo[$i + 5];
$j++;
$linea = fgets($file);
}
$costo = fgets($file);
echo $costo;
//obtenido los datos del archivo cerramos el archivo
fclose ($file);
?>
Hola amigo disculpa que te siga molestando, pero hace lo mismo, no se cierra el while ni por que ya encontró las 10 rayitas(----------). Siguiendo el ejemplo anterior del archivo .txt:
echo $variable[3][0];// Aqui mete las 10 rayitas(----------)
Entonces ahí debería de acabar el ciclo del while, pero no lo hace por que el ultimo dato lo guarda:
echo $variable[4][0];// Aqui mete el ultimo valor "60,000"
Y pues es dato deberia de entrar en el siguiente vector:
$costo = fgets ($file);
echo $costo;
Por favor ayudame ya es lo ultimo, gracias por todo tu apoyo.
Saludos
Deberías debugar un poco tu código. No puede ser que a cada tropiezo no sepas continuar. Si el bucle no se detiene, es porque la condición no se cumple. Por lo tanto, las rayitas de la condición no son exactamente iguales a las de tu fichero. Deberías averiguar eso y solucionarlo.
Te recomiendaría que no usases un sistema como el de las rayitas que es muy proclive al error. De todas formas, ya que lo usas, te recomendaría que pusieses una condición más débil. Por ejemplo:
while ($linea && susbstr($linea, 1, 8) != str_repeat("-", 8))
Gracias por todo, ya le había encontrado solución y disculpa por tantas molestias.
Cuidate y de corazón que estés de lo mejor
Saludos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas