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

2votos

Aumentar el valor de una columna dentro de un archivo .csv usando php

Busco alguna explicación o ayuda de como resolver este problema :

$s ='1245';

$f = fopen(__DIR__ .'/datos/saved.csv', 'r');
$result = false;
while ($row = fgetcsv($f, 0, ',')) {
     if ($row[0] == $s) {
        $result = $row[2];
         $a = fopen(__DIR__ .'/datos/saved.csv', 'a');
         fputcsv($a, $result+1);
         fclose($a);
         break;
        }else{
        $result = 'url no existe';

            }
}
 fclose($f);
} 

Como pueden notar busco la manera de ir aumentando el valor de la columna 2 del csv.

Si encuentra un resultado igual a la variable $s.

Aun no se por que no funciona espero alguna ayuda . gracias

carlossevi comentado Oct 5

Aunque el código se entiende, no es muy buena idea no escribir el resultado esperado y remitirnos al código, porque si estás aquí es porque el código no es como debería ser.

Por otro lado, ¿qué es lo que no funciona? ¿Da algún error? ¿El resultado no es el esperado?

Botxtrem-Solutions comentado Oct 5

el código no aumenta el valor de la columna 2 yo se que al utilizar "a" en "fopen" escribe una linea mas no la remplaza e usado "W" y el resultado es la eliminación completa de todas las columnas . por eso busco otra manera .

2 Respuestas

3votos

magarzon Puntos20570

Como te ha dicho @carlossevi sería una solución lógica escribir sobre un nuevo fichero, no sobre el mismo que estás intentando actualizar.

De todas formas, lo que quieres hacer es posible, te voy a dar una solución, pero teniendo en cuenta que tenía algunas dudas sobre tu código y lo que de verdad quieres:

  • ¿Por qué dices que quieres actualizar la segunda columna, si luego pillas el valor de $row[2], que es la tercera columna?
  • ¿Por qué escribes en el fichero (fputcsv) solo el valor actualizado de la columna, y no toda la fila?
  • ¿Por qué si encuentras una fila con el valor, haces un break, saliéndote del bucle for y no sigues leyendo/actualizando el resto de filas?
  • ¿Te das cuenta de que, si lo hicieras bien, la segunda columna se va a actualizar cada vez que ejecutes el script?
  • ¿Para qué pones el valor de $result a 'url no existe' si no encuentra el valor, si luego no lo usas para nada?

Este sería un código que cogería un fichero con dos columnas (ojo, no comprueba que alguna fila no tenga dos columnas), y si el valor de la primera columna es igual a 1245, aumenta el valor de la segunda para TODAS las filas (ojo 2, como decía, el valor de la segunda columna se va a actualizar para cada vez que ejecutes el script, no sé si es lo que quieres):

        $s ='1245';

        //Abrimos el fichero en modo c+, que permite lectura y escritura sin truncar el fichero, como hace w
        $f = fopen(__DIR__ .'/test.csv', 'c+');
        $cursor = 0;
        while ($row = fgetcsv($f)) {
            if ($row[0] == $s) {
                //Actualiza la segunda columna
                $result = $row[1]+1;
                $row[1] = $result;

                //Retrocede el cursor al principio de la fila, para sobreescribirla
                fseek($f, $cursor);

                //Escribe la fila con la segunda columna modificada
                fputcsv($f, $row);
            }
            //Actualiza el valor de la variable cursor, para que podamos volver al principio de línea en su caso
            $cursor = ftell($f);
        }

        fclose($f);

Botxtrem-Solutions comentado Oct 5

Gracias por el dato en verdad es justo lo que buscaba tengo algunos detalles que modificare para darle el uso que busco. Saludes

2votos

carlossevi Puntos61050

El problema aquí es que estás leyendo de un fichero y escribiendo sobre el mismo fichero. Si lo haces en modo 'a' (append) añades texto al final, y si lo haces en modo 'w' (write) vacía el fichero y empieza a escribir desde el inicio. Documentación de fopen.

Para no liarte para abrir el puntero en el modo correcto, colorcar el puntero en la posición que quieres reemplazar... ¿Por qué no vas generando una copia del fichero sobre la marcha con el nuevo contenido que quieres?

Creas un nuevo fichero temporal, lo abres en modo 'a' y vas volcando cada línea con la modificación que necesitas. Una vez has terminado, puedes eliminar o cambiar los nombres a los ficheros y sustituir el original por el nuevo creado.

Botxtrem-Solutions comentado Oct 5

Agrade seria si fueras tan amable de darme algún ejemplo "Código" de lo que me planteas .

carlossevi comentado Oct 5

No lo veo muy necesario... si has sido capaz de codificar el bloque de arriba no hay demasiado cambio. ¿Qué parte no ves clara? ¿La de escribir en un fichero nuevo o la de renombrar los ficheros posteriormente?

Inténtalo y nos cuentas lo que no te funciona, no te vamos a dar todo hecho para que hagas copiar y pegar sin aprender.

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

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Otras Preguntas y Respuestas


Actividad Reciente

...

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

Conecta