Agregar datos por linea a un archivo

Iniciado por shamaka, 25 Junio 2018, 04:14 AM

0 Miembros y 1 Visitante están viendo este tema.

shamaka

Hola! Tengo este fragmento de código que hace parte del trabajo.

Código (php) [Seleccionar]
$txt = fopen("archivo.php","a+");
fwrite($txt, "valor1" .chr(10));


y queda algo como:

Código (php) [Seleccionar]
valor1
valor2
...


Lo que quiero hacer es que haga eso mismo, pero despues de unas cuantas lineas. Por ejemplo, en ese archivo esta:

Código (php) [Seleccionar]
<?php
$var 
1;
$vard 2;

//Aqui quiero empezar a insertar los valores
echo "
[b]valor1
valor2[/b]
"
;
?>


Como ven, lo que quiero lograr es que se vallan agregando las lineas, despues de:

Código (php) [Seleccionar]
<?php
$var 
1;
$vard 2;


Y antes de:

Código (php) [Seleccionar]
";
?>


Espero que me puedan ayudar! Saludos
Con temor a Dios y sin miedo al hombre

shamaka

Veo que si agrego las lineas al principio no hay problema, va llenando donde lo deje en blanco. Pero no encuentro la forma de hacerlo entre las lineas de abajo.
Con temor a Dios y sin miedo al hombre

#!drvy

Estas en un problema al que todo el mundo se enfrenta tarde o temprano, todo el mundo se come la cabeza con el y al final acaban optando por soluciones más eficientes como guardar los datos en un lado externo.

Dicho esto, hay algunos modos que puedes encontrar por ahí para hacer estas cosas de forma básica e ineficiente. Ten en cuenta que en general, cuando vas a procesar e modificar un fichero, no lo estas visualizando si no que lo estas leyendo, lees los bytes buscas donde modificar e insertas lo cual equivale a sobre-escribir el fichero entero con los consecuentes aumentos de memoria.

Lo más fácil, seria coger el fichero, leerlo, determinar de cuantas lineas se compone, buscar la linea especifica en la que queremos insertar contenido, separar el contenido en dos (la primera parte antes de la linea y la segunda parte justo después), guardar la segunda mitad en memoria, añadir el nuevo contenido al final y añadir la segunda mitad que guardamos justo después.

Algo así:

Código (php) [Seleccionar]
<?php

$archivo   
'test.php';
$linea     7;
$contenido "Hola\n¿Que Tal?\nEstoy insertando contenido!";
$nuevaLinea "\n"// Deberiamos determinar las lineas nuevas o usar PHP_EOL;

// Abrimos el fichero en modo lectura, leemos todo su contenido y cerramos.
$file fopen($archivo'r');
$content fread($filefilesize($archivo));
fclose($file);


// Separamos todo en un array siendo cada elemento de este, una linea.
$contentSplit explode($nuevaLinea$content);

// Separamos el contenido en dos arrays justo donde deberiamos insertar el
// nuevo contenido. Luego añadimos al final de la primera mitad el contenido
// nuevo.
$firstHalf  array_slice($contentSplit0$linea);
$secondHalf array_slice($contentSplit$linea);
$firstHalf[] = $contenido;

// Combinamos ambas mitades de nuevo.
$finalContent array_merge($firstHalf$secondHalf);

// Unimos todo el contenido reproduciendo los saltos de linea
$finalContent implode($nuevaLinea$finalContent);

// Sobreescribimos el fichero.
$file fopen($archivo'w+');
fwrite($file$finalContent);
fclose($file);



De nuevo, esto no es optimo, no es eficiente e incluso se puede reestructurar de una forma mucho mejor (véase esta respuesta de StackOverflow), pero es para que veas los problemas a los que te enfrentas.

Saludos

shamaka

Esta solución la había pensado, pero la cantidad de memoria que exige lo hace ineficiente, como ya lo comentas. Igual agradezco tu solucion, seria seguir buscando.
Con temor a Dios y sin miedo al hombre