首页 > 解决方案 > 如何通过行号从 CSV 文件中删除特定行?

问题描述

我正在尝试通过行号从 CSV 文件中删除一行,我将其作为 URL 中的参数。

我在这里看到了一些讨论,但主要是“通过存储在第一列中的 id 删除一行”等等。在这些讨论中,我试图以与其他人相同的方式来实现它,但它不起作用。我只是改变了条件。

if (isset($_GET['remove']))
{
    $RowNo = $_GET['remove'];   //getting row number
    $row = 1;
    if (($handle = fopen($FileName, "w+")) !== FALSE)
    {
        while (($data = fgetcsv($handle, 1000, ";")) !== FALSE)
        {
//Here, I don't understand, why this condition does not work.
            if ($row != $RowNo)
            {
                fputcsv($handle, $data, ';');
            }
            $row++;
        }
        fclose($handle);
    }
}

我想,它也应该对我有用,BCS 只是条件发生了变化。但事实并非如此。它清除整个文件。你能帮我解决一下吗?

非常感谢您的任何建议。丹尼尔。

标签: phpcsv

解决方案


如果您的 CSV 可以适合内存,则可以选择:

// Read CSV to memory array
$lines = file($fileName, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);

// Remove element from array
unset($lines[$rowNo - 1]); // Validate that element exists!

// Rewrite your CSV file
$handle = fopen($fileName, "w+");

for ($i = 0; $i < count($lines); $i++) {
    fputcsv($handle, $data, ';');
}

fclose($handle);

如果您的 CSV 不适合内存,请选择:

使用问题中的代码,只需写入单独的文件,然后用实际文件替换它:

$handle = fopen($FileName, "r");

 // Read file wile not End-Of-File
 while (!feof($fn)) {
    if ($row != $RowNo) {
        file_put_contents($FileName . '.tmp', fgets($fn), FILE_APPEND);
    }

    $row++;
}

fclose($handle);

// Remove old file and rename .tmp to previously removed file
unlink($FileName);
rename($FileName . '.tmp', $FileName);

推荐阅读