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

Modifcar una linea especifica de un txt con php

Hola a todos encontre esta función para modificar una linea especifica pero necesito que sea dinamico he probado de diferentes formas,

$archivo = '../comprobanteC.txt';
$abrir = fopen($archivo,'r+');
$contenido = fread($abrir,filesize($archivo));
fclose($abrir);

// Separar linea por linea
$contenido = explode("\n",$contenido);

// Modificar linea deseada ( 2 ) 
$contenido[0] = $_POST['numCmbnt'].'|'.$_POST['centroC'].'|'.$_POST['proycto'];

// Unir archivo
$contenido = implode(PHP_EOL,$contenido);

// Guardar Archivo
$abrir = fopen($archivo,'w');
fwrite($abrir,$contenido);
fclose($abrir);

3votos

Leonardo-Tadei comentado

Hola @Jhon_Numpaque,

qué quiere decir "que sea dinámico" ?

por otra parte, si no veo mal tu ejemplo, lo que te modifica es la primer línea, no la segunda.

Sabés a priori qué nro de línea tenés que modificar? O tenés que buscar algo en el archivo para saber a dónde modificar?
Si tenés que buscar en el archivo, pasanos la estructura y 3 o 4 renglones de ejemplo...

0voto

Alex_Numpaque comentado

la estructura del archivo es
20160000001|12|2
20160000002|6|1
20160000003|2|4
20160000004|1|1

La primera columna es el identificador la segunda y tercera son las id que debo guardar y mantener

2votos

Leonardo-Tadei comentado

Gracias por la estructura y el ejemplo.

Cómo determinás qué lineas es que te tenés que modificar? Sabés qué número de línea es o tenes que buscarla por el identificador??

0voto

Alex_Numpaque comentado

tengo que buscarla linea con el identificador

1 Respuesta

3votos

Leonardo-Tadei Puntos227320

Hola @Jhon_Numpaque,

con esa estructura y teniendo que buscar por el identificador, podrías hacer algo así:

function modificarComprobantes($id, $dato1, $dato2){
  $archivo = '../comprobanteC.txt';
  $a = file($archivo); // lo carga a un vector
  foreach($a as $k => $l){
    // recorre el vector pareseando las líneas
    $ll = explode('|', $l);
    if ($ll[0] == $id){
      // si encuentra la línea, modifica
      $ll[1] = $dato1;
      $ll[2] = $dato2;
      // rearma la cadena
      $tmp = implode('|', $ll);
      // la asigna al vector en la posición orginal
      $a[$k] = $tmp;
      // sale del foreach, porque no tiene sentido seguir buscando.
      break;
    }
  }
  // Guarda el vector resultado sobreescribiendo el archivo
  // Unir archivo
  $contenido = implode(PHP_EOL,$a);
  $abrir = fopen($archivo,'w');
  fwrite($abrir,$contenido);
  fclose($abrir);
  return true;
}

Para usar la función, la llamás pasándolo los 3 parámetros.

Tal vez se me haya colado algún error de sintaxis, porque escribí el código directamente acá, pero lo importante es la idea.

Como variación a tu código, estoy cargando el archivo origen directamente en un vector, porque es más cómodo y eficiente para la recorrida.

Observación: manejar un archivo de texto se vuelve muy ineficiente a medida que crece. Por qué no tenés una tabla con estos 3 valores, y en caso necesario, generás el archivo con un proceso de exportación de la tabla a texto? Esto te permitiría hacer las actualizaciones de forma mucho más ágil e independiente del tamaño del archivo, a la vez que exportarlo cada vez que haga falta.

Saludos cordiales!

1voto

Alex_Numpaque comentado

Acabo de probar y si funciono gracias por tu ayuda y tendré en cuenta tu consejo.. :D

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