【问题标题】:find and replace values in a flat-file using PHP使用 PHP 查找和替换平面文件中的值
【发布时间】:2011-02-26 00:13:36
【问题描述】:

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

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

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

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

【问题讨论】:

  • 不要忘记某种锁定机制。 2个脚本同时编辑文件肯定有问题。
  • CSV 是“逗号分隔值”的首字母缩写词,您的分隔符是管道而不是逗号。尽管许多 CSV 导入程序允许您将分隔符设置为不是逗号的字符,但我仍然认为最好将其称为“平面文件”。 en.wikipedia.org/wiki/Flat_file_database
  • @extraneon 是的,这仅适用于管理员。每个管理员将有一个文件。但是为了安全起见,我会研究一下锁定机制(:谢谢你提醒我。@Hostile Fork,是的,我知道,但两者之间真的没有任何实际区别,是吗?
  • “当我使用一个词时,”矮胖子用相当轻蔑的语气说道。 “这就是我选择的意思,不多也不少。” ——“问题是,”爱丽丝说,“你能不能用词来表达这么多不同的东西。” :) 选择准确的术语可以避免混淆并有助于相关标记。
  • @Hostile Fork (: 没有什么比引用 Lewis Carroll 来获得关于语义的观点更重要了。观点采取了。

标签: php regex replace flat-file


【解决方案1】:

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

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

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

【讨论】:

  • 性能不是问题,真的。该文件最多可能有 5 行,这就是为什么我不会打扰 MySQL。但是每个客户端/用户将有一个文件。不过,我会看看 SQLite。谢谢。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2017-03-24
    • 1970-01-01
    • 2019-01-23
    • 2018-02-14
    • 2021-11-06
    • 2017-08-07
    • 2012-09-25
    • 2011-10-22
    • 1970-01-01
    相关资源
    最近更新 更多