Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从CSV文件中删除行并自动生成新文件_Php_Fgetcsv_Fputcsv - Fatal编程技术网

Php 从CSV文件中删除行并自动生成新文件

Php 从CSV文件中删除行并自动生成新文件,php,fgetcsv,fputcsv,Php,Fgetcsv,Fputcsv,我正在尝试用PHP操作现有的.csv文件!我浏览了大多数StackOverflow问题,发现哪一个最适合我的需要 我设置了$id=2,因此我希望代码会影响.csv文件中的第2行,并且会生成一个新生成的没有第2行的.csv文件 这是我的密码: $id=2; $fptemp = fopen('files/FL_insurance_small-temp.csv', "a+"); if (($handle = fopen('files/FL_insurance_small.csv', "r")) !==

我正在尝试用PHP操作现有的.csv文件!我浏览了大多数StackOverflow问题,发现哪一个最适合我的需要

我设置了
$id=2
,因此我希望代码会影响.csv文件中的第2行,并且会生成一个新生成的没有第2行的.csv文件

这是我的密码:

$id=2;
$fptemp = fopen('files/FL_insurance_small-temp.csv', "a+");
if (($handle = fopen('files/FL_insurance_small.csv', "r")) !== FALSE) {
    while (($id= fgetcsv($handle)) !== FALSE) {
        if ($id != $data[0]) {
            $list = array($data);
            fputcsv($fptemp, $list);
        }
    }
    fclose($handle);
    fclose($fptemp);

    rename('files/FL_insurance_small-temp.csv','files/output/FL_insurance_small_new.csv');
    echo "Row with ID: ".$id." successfully deleted!";
} else {
    print "There seems to be a problem.";
}
由于在输出文件夹中生成了一个新文件,所以一切似乎都正常工作。我的问题是,新生成的文件是空的。有人知道为什么吗?我错过了什么

示例数据(.csv):


读取文件时-您正在覆盖的
$id
是您要查找的行。相反,您的循环应该将值分配给
$data

$rowcount = 1;
while ($data= fgetcsv($handle)) {
    if ($id != $rowcount++) {
        fputcsv($fptemp, $data);
    }
}
$rowCount
是当前正在读取的行,因此在读取中的新行时,会将其与每行进行比较

这也将删除对
$list
的冗余分配

要“删除”(或ommit)记录列表

$id= [2,5,7];
$rowcount = 1;
while ($data= fgetcsv($handle)) {
    if (!in_array($rowcount++, $id)) {   // Only write row if not in the list
        fputcsv($fptemp, $data);
    }
}

读取文件时-您正在覆盖的
$id
是您要查找的行。相反,您的循环应该将值分配给
$data

$rowcount = 1;
while ($data= fgetcsv($handle)) {
    if ($id != $rowcount++) {
        fputcsv($fptemp, $data);
    }
}
$rowCount
是当前正在读取的行,因此在读取中的新行时,会将其与每行进行比较

这也将删除对
$list
的冗余分配

要“删除”(或ommit)记录列表

$id= [2,5,7];
$rowcount = 1;
while ($data= fgetcsv($handle)) {
    if (!in_array($rowcount++, $id)) {   // Only write row if not in the list
        fputcsv($fptemp, $data);
    }
}


$data
在哪里定义?谢谢Patrick。这似乎是问题所在,你是对的。您能告诉我如何更改代码以便定义$data吗?我被我发布的代码绊住了。我不能告诉你,因为我不确定你打算
$data
做什么。也许你的意思是
$data=fgetcsv($handle)
?为什么要用PHP开发一个应用程序来完成这样的任务?您确实不想将平面文件用作数据库。如果是一次性的,文本编辑器或一行shell脚本会更快、更容易调试。@symcbean我有500多个.csv文件,其中第3-8行应该删除。每个文件都是相同的。因此,在我看来,一个简单的php脚本应该是最快的方式。可能有更好的方法,但PHP实际上是我所知道的编程语言。:)
$data
在哪里定义?谢谢Patrick。这似乎是问题所在,你是对的。您能告诉我如何更改代码以便定义$data吗?我被我发布的代码绊住了。我不能告诉你,因为我不确定你打算
$data
做什么。也许你的意思是
$data=fgetcsv($handle)
?为什么要用PHP开发一个应用程序来完成这样的任务?您确实不想将平面文件用作数据库。如果是一次性的,文本编辑器或一行shell脚本会更快、更容易调试。@symcbean我有500多个.csv文件,其中第3-8行应该删除。每个文件都是相同的。因此,在我看来,一个简单的php脚本应该是最快的方式。可能有更好的方法,但PHP实际上是我所知道的编程语言。:)谢谢你的回答。您更新的代码似乎正常工作,因为在新创建的文件中插入了来自已编辑的.csv文件的数据。现在的问题是,代码没有任何效果。我收到消息“ID为2的行已成功删除!”,但在新文件中,第2行仍然存在。“你知道为什么吗?”克里斯托弗。请把样本数据直接放到你的问题中(不是链接)。哦,好的。我不想删除具有特定ID的行。我想从文件中删除第二行。因此$id不应该是id,而应该是文件中的行。如果我输入$id=234,脚本将从.csv文件中删除第234行。这就是我想要做的。太棒了。正是我想要的。非常感谢你,奈杰尔。我会把你的答案标为正确答案。最后一个问题:是否可以一次删除多行?如果是这样,你能告诉我我的代码应该是什么样子吗。例如:我想从.csv文件中删除第3,4,5,6,7,8,9行。你有主意吗?@ChristophC。只是一个小问题,你实际上并没有删除这些行。您正在将它们从写入新文件的内容中删除。谢谢您的回答。您更新的代码似乎正常工作,因为在新创建的文件中插入了来自已编辑的.csv文件的数据。现在的问题是,代码没有任何效果。我收到消息“ID为2的行已成功删除!”,但在新文件中,第2行仍然存在。“你知道为什么吗?”克里斯托弗。请把样本数据直接放到你的问题中(不是链接)。哦,好的。我不想删除具有特定ID的行。我想从文件中删除第二行。因此$id不应该是id,而应该是文件中的行。如果我输入$id=234,脚本将从.csv文件中删除第234行。这就是我想要做的。太棒了。正是我想要的。非常感谢你,奈杰尔。我会把你的答案标为正确答案。最后一个问题:是否可以一次删除多行?如果是这样,你能告诉我我的代码应该是什么样子吗。例如:我想从.csv文件中删除第3,4,5,6,7,8,9行。你有主意吗?@ChristophC。只是一个小问题,你实际上并没有删除这些行。您正在从写入新文件的内容中忽略它们。