3

我想已经有一个关于这个的问题,但我找不到。也许解决方案太简单了......无论如何,我有一个平面文件,并希望让用户根据名称更改值。我已经整理好使用该fopen('a')模式创建新的名称+值对,使用 jQuery 发送 AJAX 调用newValuenewName。但是说内容看起来像这样:

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

现在我想改变这个folder值。所以我会发送folderasoldName/tags/as newValue。覆盖值的最佳方法是什么?列表中的顺序无关紧要,名称将始终位于左侧,然后是|(管道)、值,然后是new-line

我的第一个想法是读取列表,将其存储在一个数组中,搜索所有[0]'s oldName,然后更改[1]属于它的那个,然后将其写回文件。但我觉得有更好的方法来解决这个问题?有任何想法吗?也许正则表达式

4

2 回答 2

9

一个非常简单的方法是在整个文件上使用 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 文件。

于 2010-05-31T14:37:45.507 回答
5

您可以使用 APC 等 PHP 功能将列表保存在内存中,并每隔一段时间将其写入磁盘。这样,您仅在内存中不存在时才读取它。

如果您想以性能为导向,将这些信息存储在 CSV 中可能不是最好的开始。如果您不想使用真正的 RDMS (MySQL),那么我建议您使用 SQLite。在这种情况下,它提供了您正在寻找的所有功能(更新),并且它的行为与 CSV 完全相同,因为它只是您硬盘上的一个文件并且没有并发性。

如果这不是一个选项,另一种方法是使用 sed 和 awk 等 shell 级别的命令来进行内联正则表达式更改。最后,将整个文件读入一个字符串,对其执行讨厌的正则表达式调整(s///),然后再次将其写出即可

于 2010-05-31T14:19:26.283 回答