【问题标题】:Delete current iterating row from CSV file in PHP从 PHP 中的 CSV 文件中删除当前迭代行
【发布时间】:2017-09-22 11:48:33
【问题描述】:

我想从 CSV 文件中删除当前的迭代行, 假设我的 CSV 文件中有 5 行(1、2、3、4、5),我在使用 foreach 逐一迭代行时打开了我的文件,当涉及到第 3 行时,应该从 CSV 文件中删除第 3 行其他 1,2,4,5 行在相同的迭代中将相同。我不想像跳过第 3 次迭代那样使用并将其保存到另一个文件中,而不是像重命名文件名那样使用。那么,请任何人都可以帮助我如何在 PHP 中做到这一点?

假设,类似删除当前行的SQL命令,PHP中有什么东西吗?

谢谢。

【问题讨论】:

  • 将文件读入数组,取消设置行并写回
  • 你为什么反对读取文件并写一个新文件减去你想丢弃的行?在处理较大的文件时,您应该避免任何内存问题。
  • 最好的方法是备份文件,读取文件并将修改写入第一个文件。万事如意!
  • @X33 实际上我正在将它用于magento观察者,每次我重新加载我的产品时都会加载观察者。所以,根据我的要求,将数据保存到新文件中是行不通的。
  • @SubjectDelta 好的,让我试试你的想法,做一些改变。谢谢

标签: php file delete-row


【解决方案1】:

您需要拥有写入文件的权限。如果删除一行,则必须保存文件。由于您也不希望有任何空行,因此您需要读取整个文件。

我建议获取文件内容,并按行将其拆分为数组。使用explode 功能,您可以通过换行符分割内容,最有可能是“\n”。因此,将存在一个包含 csv 文件每一行的数组。现在您可以简单地从数组中删除该行并从中创建一个字符串,然后再将更改的内容保存回 csv 文件。

// get csv content into string variable
$csvContent = file_get_contents(__DIR__ . "/yourfile.csv");
// create array out of csv, limited by PHP_EOL wich determines the systems line break
// this means, every line in the csv file will be represended by an array key and its value
$csvArray = explode(PHP_EOL, $csvContent);

// unset the 3th csv line. 
unset($csvArray[2]); // keep in mind array starts at 0, so third line is array key 2 

// from here on you can manipulate the array $csvArray as you like. 
// add lines, remove lines or just use the given content for future operations. 
// you can also iterate over the array with: foreach ($csvArray as $line => $value) {}

// create string out of modified csv array
$csvContent = implode(PHP_EOL, $csvArray);
// save result back into the csv file
file_put_contents( __DIR__ . "/yourfile.csv", $csvContent);

检查 implode/explode php 函数文档:

http://php.net/manual/en/function.implode.php

http://php.net/manual/en/function.explode.php

【讨论】:

  • 最好使用PHP_EOL 作为行尾
  • @natheriel 我想在根据我的要求迭代第 4 行和第 5 行之前删除我的第 3 行。那么有可能吗?
  • @Naveen 使用这种方法你根本不需要迭代。你得到整个文件,用文件的每一行作为一个数组条目创建一个数组。然后删除条目。您可以在我的代码中的“未设置”之后添加任何迭代。在这种情况下,您可以遍历第三行已经消失的数组。最后,使用 implode 从数组中创建一个字符串。然后将字符串写回文件。
  • @natheriel 对,但我的要求不同,我得到 5 行一一,在迭代第一行时,如果行的数据符合我的逻辑,则应用一些逻辑,否则我需要它想要删除这一行并且不想下次从文件中获取它,与其他行相同。如果我使用您的逻辑,您将获取所有行然后删除第三行。所以像这样我不能在每一行上应用我的逻辑,意味着当它不满足我的逻辑时我想尽快删除那些行。原因是我正在使用 Magento 观察者,所以我的要求就是这样。
  • 文件处理不适合我的问题,现在我使用 db 来解决这个问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 2018-08-15
  • 2014-12-16
相关资源
最近更新 更多