php - 如何在大文件中的最后一个字符之前插入字符串
问题描述
我有一个由单个字符串组成的非常大的文件。由于文件的大小,我不想将整个字符串读入内存。
最后一个字符将始终是右括号]
,因为此字符串是 json 数组。我想在右括号之前插入一个小的 json 对象(表示为字符串)。我已经看到了一些想法,但无法得到任何工作。
如您所见,我正在尝试打开文件并使用fseek
将文件指针移动到]
. 然后我尝试将新字符串写入该位置的现有字符串。
但是,这样做的效果只是将新字符串附加到现有字符串的末尾,这不是我想要的。
作为一个简化的示例,假设文件开始时包含以下字符串:
[{"name":"alice","city":"london"}]
然后我想使用以下代码将第二个人添加到此列表中:
$new_person = ",{\"name\":\"bob\",\"city\":\"paris\"}";
$filename = "people.json";
$fh = fopen($filename, "a+");
$filesize = filesize($filename);
$stat = fstat($fh);
fseek($fh, $stat[$filesize]-1);
fwrite($fh, $new_person);
fclose($fh);
但我最终得到的是一个包含此字符串的文件:
[{"name":"alice","city":"london"}],{"name":"bob","city":"paris"}
我的 PHP 技能很糟糕。我不知道我fseek
是指向错误的位置还是问题出在其他地方。谢谢你的帮助。
解决方案
从文档(强调我的):
a+
:开放读写;将文件指针放在文件末尾。如果该文件不存在,请尝试创建它。在这种模式下, fseek() 只影响读取位置,写入总是附加的。
改为使用r+
模式,而不是fstat
你可以这样做:
fseek($fh, -1, SEEK_END);
推荐阅读
- wget - 为什么 wget 只得到一个空文件夹?
- ruby-on-rails - 我们可以在 ruby on rails 6 中将一些变量附加到路由路径吗?
- linux - Fio 结果稳步提升 IOPS,出乎我的意料
- flutter - 无法导航到下一页 PageView
- javascript - 如何存根 AJAX 请求,其响应取决于传递的数据?
- python - 在 Spyder 中运行脚本时没有任何反应
- r - 在 R 中使用 map 函数而不是 for 循环
- python - QWebEngineView:计时器在可见时不起作用
- python - 绘制直方图会给出高度错误消息
- java - 在 Gradle JavaExec 任务中保持静态数据初始化