【问题标题】:Delete csv lines in foreach在 foreach 中删除 csv 行
【发布时间】:2018-03-14 00:43:27
【问题描述】:

我有一个很大的列表,如何将 foreach 中的每个循环从文件“list.csv”中排除通过 foreach 的行?

$myGetCsv = function ($str) {
    return str_getcsv($str, ';');
};    

$lines = array_map($myGetCsv, file(''.get_template_directory_uri() . '/list.csv'));     

foreach($lines as list($var1, $var2)) {
    //CODE
}

示例:

原始文件:

test1, subtest1;  // test1 is $var1 and subtest1 is $var2
test2, subtest2;
test3, subtest3;

第一个 foreach 之后的 list.csv

test2, subtest2;
test3, subtest3;

第二个foreach之后的list.csv

test3, subtest3;

第三个foreach之后的list.csv

empty

【问题讨论】:

  • 即始终删除文件的第一行?
  • @felipsmartins 是的,永远是第一个
  • @felipsmartins 想得很好,它必须匹配刚刚在foreach中通过的行,该行永远不能在foreach中再次通过
  • 列表有多大?根据大小,只需调用file() 函数,然后调用array_shift(),然后调用file_put_contents(join("\n", $lines)) 或类似的东西......
  • 大约 5000 行

标签: php csv foreach fopen


【解决方案1】:

根据您在 cmets 中的说明,您尝试从文件中删除行的唯一原因似乎是因为您无法将整个文件加载到内存中并且希望在多次执行中解析大文件脚本。

如果上述陈述是准确的,简短的回答是您不必将整个文件加载到内存中。

您可以使用SplFileObject 类逐个遍历整个文件。只需确保在循环中您没有将行缓存在内存中,而是将其保存到新的目的地,如数据库。

例子:

$file = new SplFileObject('/path/to/file/list.csv');
$file->setFlags(SplFileObject::READ_CSV);
$file->setCsvControl(';');

// Iterate through the whole file reading on line at a time
foreach ($file as $row) {
    list($var1, $var2) = $row;

    // Do what you want her but do not keep row info in memory
}

【讨论】:

  • 谢谢!请问,当我调用该函数时,再次调用该函数时如何不将行保留在内存中?
  • 不要将$row中的数据保存到另一个变量中。例如:$lines[] = $row.
  • 出现此错误SplFileObject::rewind(): stream does not support seeking
  • 我试图通过您遇到的原始问题引导您朝着正确的方向前进,但恐怕我无法帮助您解决脚本的其余部分问题。请参阅 php 文档或 google 出现的更多错误。祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 2021-01-14
  • 2013-04-22
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多