如何通过行号从CSV文件中删除特定行?

时间:2019-10-01 08:55:16

标签: php 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的条件。但事实并非如此。清除整个文件。你能帮我吗?

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

2 个答案:

答案 0 :(得分:1)

如果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);

答案 1 :(得分:0)

您可以使用file()将文件加载为行数组。

然后删除该行并写回文件。

// read the file into an array    
$fileAsArray = file($FileName);

// the line to delete is the line number minus 1, because arrays begin at zero
$lineToDelete = $_GET['remove'] - 1;

// check if the line to delete is greater than the length of the file
if ($lineToDelete > sizeof($fileAsArray)) {
    throw new Exception("Given line number was not found in file.");
}

//remove the line
unset($fileAsArray[$lineToDelete]);

// open the file for reading
if (!is_writable($fileName) || !$fp = fopen($fileName, 'w+')) {
    // print an error
    throw new Exception("Cannot open file ($fileName)");
}

// if $fp is valid
if ($fp) {
    // write the array to the file
    foreach ($fileAsArray as $line) {
        fwrite($fp, $line);
    }

    // close the file
    fclose($fp);
}

如果您使用的是Unix系统,也可以使用sed命令:

exec("sed -e '{$lineToDelete}d' {$FileName}");

如果使用了用户输入,请记住清洁命令参数: https://www.php.net/manual/de/function.escapeshellcmd.php