有没有有效的方法来更新/删除CSV文件中的特定行?所有其他方法包括读取整个文件的内容,创建临时文件,然后用它替换旧文件等......但是,假设我有包含 10000 条记录的大型 CSV,因此这种解决方案将相当耗费资源。假设我无法使用数据库,因此写入文件是存储数据的唯一方法。所以,问题是,最有效的方法是什么?提前谢谢你!
你将不得不读取整个文件。 对不起,没办法。 CSV 是单个平面文本文件,其中包含随机大小的字段和行。
您绝对不应该直接使用 CSV 进行数据库操作。 您应该将数据拉入数据库以使用它,然后在完成后将其输出回CSV。
你没有提到为什么你不能使用数据库,所以我会猜测这是一个资源问题,你也没有说为什么你不想重写文件,所以我会猜测这是由于性能。 您可以缓存多个操作并一次执行所有操作,但您不会避免重写文件的全部或至少部分。
考虑将
csv 逐行读取到多维数组中,并在某一行进行更改。然后,将数组数据导出为 csv。下面的示例修改第 100 行,假设有一个 6 列逗号分隔的 csv 文件 (0-5(。
现在,如果要删除该行,请通过有条件地跳到具有 continue
的下一个循环迭代来将其从数组$newdata
排除。或者,如果要更新,只需将当前内部数组$newdata[$i]
设置为新值:
$i = 0;
$newdata = [];
$handle = fopen("OldFile.csv", "r");
// READ CSV
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
// UPDATE 100TH ROW DATA (TO EXCLUDE, KEEP ONLY $i++ AND continue)
if ($i == 99) {
$newdata[$i][] = somenewvalue;
$newdata[$i][] = somenewvalue;
$newdata[$i][] = somenewvalue;
$newdata[$i][] = somenewvalue;
$newdata[$i][] = somenewvalue;
$newdata[$i][] = somenewvalue;
$i++;
continue;
}
$newdata[$i][] = $data[0];
$newdata[$i][] = $data[1];
$newdata[$i][] = $data[2];
$newdata[$i][] = $data[3];
$newdata[$i][] = $data[4];
$newdata[$i][] = $data[5];
$i++;
}
// EXPORT CSV
$fp = fopen('NewFile.csv', 'w');
foreach ($newdata as $rows) {
fputcsv($fp, $rows);
}
fclose($fp);
将 CSV 分解为多个文件,全部在一个目录中。这样,您仍然需要重写文件,但您不必重写那么多。
有点晚了,但对于可能搜索相同内容的人来说,您可以将 csv 放入 sqlite 中,此外,您还可以在数据集中进行搜索。有一些示例代码:通过PHP将CSV文件导入SQLite数据库