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 只是条件发生了变化。但事实并非如此。它清除整个文件。你能帮我解决一下吗?
非常感谢您的任何建议。丹尼尔。
解决方案
如果您的 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);
推荐阅读
- python - 使用 cogs 的不和谐问候,on_member_join 不起作用
- algorithm - 如何计算由三角形网格定义的空心物体的惯性张量?
- java - 如何将多个用户连接在一起并发送每个连接的用户信息?(爪哇)
- python - 尝试按年龄组对输入进行排序时出现“浮动”错误
- kotlin - 如何使用 KotlinPoet 为 PropertySpec 获取正确的 TypeName
- prestashop-1.7 - 在购物车中查看产品类别 Prestashop 1.7
- python - 具有 pop() 方法的自定义类未返回正确的新列表长度
- c++ - Visual Studio 2019 - 如何使用多个预编译头文件设置项目
- reactjs - 在迭代中插入列表数据(地图)
- tensorflow - 是否可以在 keras 功能 API 中为训练和测试添加不同的行为