是否有更新/删除CSV文件中特定行的有效方法?每个其他方法包括读取整个文件的内容,创建临时文件,然后用它替换旧文件等... 但是,让我们说,我拥有10000条记录的大型CSV,因此这种解决方案相当资源丰富。 让我们说,我无法使用数据库,因此写入文件是存储数据的唯一方法。 所以,问题是,最有效的方法是什么? 提前谢谢!
答案 0 :(得分:3)
您将不得不阅读整个文件。对不起,没办法。 CSV是单个平面文本文件,具有随机大小的字段和行。
您绝对不应该直接使用CSV进行数据库操作。您应该将数据拉入数据库以使用它,然后在完成后将其输出回CSV。
你没有提到为什么你不能使用数据库,所以我猜这是一个资源问题,你也没有说你为什么不想重写文件,所以我'我猜这是由于表现。你可以缓存一些操作并一次性完成它们,但是你不会放弃重写文件的全部或至少某些部分。
答案 1 :(得分:2)
在一个目录中将CSV分成多个文件。 这样你仍然需要重写文件,但你不必重写几乎一样多。
答案 2 :(得分:2)
考虑将csv逐行读入多维数组,并在某一行进行更改。然后,将数组数据导出到csv。假设一个6列逗号分隔的csv文件(0-5),下面的示例修改了第100行。
现在,如果要删除该行,请通过有条件地跳转到$newdata
的下一循环迭代,将其从continue
数组中排除。或者,如果要更新,则将当前内部数组$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);
答案 3 :(得分:0)
有点晚了,但是对于可能搜索相同内容的人,您可以将csv放入sqlite中,这使您可以在数据集中进行搜索。有一些示例代码:Import CSV File into a SQLite Database via PHP