我认为这已经有了一个问题,但我找不到一个。也许解决方案太容易了......无论如何,我有一个平面文件,并希望让用户根据名称更改值。我已经整理出使用fopen('a')
模式创建新名称+值对,使用jQuery通过newValue
和newName
发送AJAX调用。但是说内容看起来像这样:
host|http:www.stackoverflow.com
folder|/questions/
folder2|/users/
现在我要更改folder
值。因此,我将folder
作为oldName
和/tags/
作为newValue
发送。覆盖价值的最佳方法是什么?列表中的顺序无关紧要,名称将始终位于左侧,后跟|
(管道),值,然后是new-line
。
我的第一个想法是阅读列表,将其存储在一个数组中,搜索所有[0]
的{{1}},然后更改属于它的oldName
,然后把它写回文件。但我觉得有一个更好的解决方法吗?有任何想法吗?也许regex?
答案 0 :(得分: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,最好只有一个CSV文件而不是CSV文件。
答案 1 :(得分:5)
您可以使用像APC这样的PHP功能将列表保存在内存中,并且每隔一段时间将其写入磁盘。这样,只有在内存中不存在时才会读取它。
如果您希望以性能为导向,以CSV格式存储此信息可能不是最好的开始。如果您不想使用真正的RDMS(MySQL),那么我建议使用SQLite。在这种情况下,它提供了您正在寻找的所有功能(更新),它与CSV完全相同,因为它只是硬盘上的一个文件而且没有并发性。
如果这不是一个选项,另一种方法是使用shell级别命令,如sed& awk做内联正则表达式更改。最后,将整个文件读成字符串,对其执行令人讨厌的正则表达式调整(s///
)然后再将其写出来将起作用