我正在尝试通过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的条件。但事实并非如此。清除整个文件。你能帮我吗?
非常感谢您的任何建议。丹尼尔。
答案 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