buscar y reemplazar valores en un archivo plano usando PHP

Creo que ya había una pregunta sobre esto, pero no puedo encontrar ninguna. Tal vez la solución es demasiado fácil … De todos modos, tengo un archivo plano y quiero que el usuario cambie los valores en función de un nombre. Ya resolví la creación de un nuevo nombre + pares de valores utilizando el modo fopen('a') , usando jQuery para enviar la llamada AJAX con newValue y newName . Pero di que el contenido se ve así:

 host|http:www.stackoverflow.com folder|/questions/ folder2|/users/ 

Y ahora quiero cambiar el valor de la folder . Así que enviaré en la folder como oldName y /tags/ como newValue . ¿Cuál es la mejor manera de sobrescribir el valor? El orden en la lista no importa, y el nombre siempre estará a la izquierda, seguido de un | (tubería), el valor y luego una new-line .

Mi primer pensamiento fue leer la lista, almacenarla en una matriz, buscar todos los [0] para oldName , luego cambiar el [1] que le pertenece, y luego escribirlo en un archivo. Pero siento que hay una mejor manera de evitar esto? ¿Algunas ideas? Tal vez Regex ?

Una manera muy fácil sería usar str_replace () en todo el archivo:

 // read the file $file = file_get_contents('filename.csv'); // replace the data $file = str_replace('folder|oldValue', 'folder|newValue', $file); // write the file file_put_contents('filename.csv', $file); 

Eso debería funcionar como un solo usuario, el archivo a la vez. Pero una base de datos siempre es una mejor idea. Si necesita CSV, es mejor tener una secuencia de comandos DB a CSV adicional que solo un archivo CSV.

Puede mantener la lista en la memoria utilizando una función de PHP como APC y escribirla de vez en cuando en el disco. De esa forma solo lo leerás cuando no exista en la memoria.

Si quieres estar orientado al rendimiento, almacenar esta información en un archivo CSV probablemente no sea lo mejor para empezar. Si no quiere usar un verdadero RDMS (MySQL), entonces le sugiero que use SQLite. Proporciona todas las características que está buscando (ACTUALIZAR) en este caso y actúa exactamente igual que un archivo CSV en el sentido de que es solo un archivo en su disco duro y no tiene concurrencia.

Si eso no es una opción, la otra forma es usar comandos de nivel de shell como sed & awk para hacer cambios de expresiones regulares en línea. Por último, leer todo el archivo en una cadena, realizar un desagradable ajuste de expresiones regulares en él ( s/// ) y luego escribirlo de nuevo funcionaría

    Intereting Posts