найти и заменить значения в плоском файле с помощью PHP - PullRequest
3 голосов
/ 31 мая 2010

Я думаю, что уже был вопрос по этому вопросу, но я не могу его найти. Возможно, решение слишком простое ... Во всяком случае, у меня есть плоский файл и я хочу позволить пользователю изменять значения в зависимости от имени. Я уже разобрался в создании новых пар имя + значение в режиме fopen('a'), используя jQuery для отправки вызова AJAX с newValue и newName. Но, скажем, контент выглядит так:

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

А теперь я хочу изменить значение folder. Поэтому я отправлю folder как oldName и /tags/ как newValue. Какой лучший способ перезаписать значение? Порядок в списке не имеет значения, и имя всегда будет слева, за которым следует | (труба), значение, а затем new-line.

Моей первой мыслью было прочитать список, сохранить его в массиве, найти все [0] для oldName, затем изменить принадлежащий ему [1], а затем записать его обратно в файл , Но я чувствую, что есть лучший способ обойти это? Есть идеи? Может быть регулярное выражение ?

Ответы [ 2 ]

9 голосов
/ 31 мая 2010

Очень простой способ использовать str_replace () для всего файла:

// 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);

Это должно работать только как один пользователь файл за раз. Но база данных - всегда лучшая идея. Если вам нужен CSV, лучше иметь дополнительный скрипт DB в CSV, чем только файл CSV.

5 голосов
/ 31 мая 2010

Вы можете хранить список в памяти, используя функцию PHP, такую ​​как APC, и время от времени записывать его на диск. Таким образом, вы читаете его только тогда, когда его нет в памяти.

Если вы хотите ориентироваться на производительность, хранение этой информации в формате CSV, вероятно, не самое лучшее для начала. Если вы не хотите использовать настоящую RDMS (MySQL), я бы предложил использовать SQLite. Он предоставляет все функции, которые вы ищете (ОБНОВЛЕНИЕ) в этом случае, и действует точно так же, как CSV, в том смысле, что это просто файл на вашем жестком диске и не имеет параллелизма.

Если это не вариант, другой способ - использовать команды уровня оболочки, такие как sed & awk, для внесения изменений в регулярные выражения. Наконец, чтение всего файла в строку, выполнение мерзкой корректировки регулярного выражения (s///) и последующее его повторное запись будет работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...