PHP - 更新CSV文件中的特定行

时间:2016-02-16 18:22:50

标签: php csv

是否有更新/删除CSV文件中特定行的有效方法?每个其他方法包括读取整个文件的内容,创建临时文件,然后用它替换旧文件等... 但是,让我们说,我拥有10000条记录的大型CSV,因此这种解决方案相当资源丰富。 让我们说,我无法使用数据库,因此写入文件是存储数据的唯一方法。 所以,问题是,最有效的方法是什么? 提前谢谢!

4 个答案:

答案 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