【问题标题】:LimitIterator offset 1 with 2 elementsLimitIterator 偏移量 1 和 2 个元素
【发布时间】:2018-12-06 06:37:37
【问题描述】:

我面临的问题是我有一个读取 CSV 文件的 SplFileObject,然后我将它包装到一个 LimitIterator。

CSV 文件有 2 行、标题和 1 行,我将 LimitIterator 偏移量设置为 1,但无法覆盖它,似乎索引存在一些内部问题。

代码如下:

    $csvFile = new \SplFileObject($fileName);
    $csvFile->setFlags(\SplFileObject::READ_CSV);
    $iterator = new \LimitIterator($csvFile, 1);

    /** @var \LimitIterator $it */
    foreach ($iterator as $it) {

        list($.., $.., $..) = $it;
        $result[] = [
            ...
        ];
    }


    return $result;

如果 CSV 有 3 行(标题和 2 行),代码运行良好,但只有标题和 1 行,它不起作用。

有什么想法吗?

谢谢。

【问题讨论】:

  • 我用简单的 csv 尝试了你的代码 - 它有效。检查您的数据,是否已损坏?
  • 我可以看看你的简单 CSV 吗?感谢您的帮助

标签: php csv


【解决方案1】:

就个人而言,我会为此使用 fopen 和 fgetcsv 函数,如下所示;

<?php
$handle = fopen("myFile.csv", "r");

if ($handle != false)
{
    $header_row_handled = false;
    while ($datarow = fgetcsv($handle, 0, ",")
    {
        if (!$header_row_handled)
        {
            $header_row_handled = true;
        }
        else
        {
            /* Whatever you need */
            $dataparta = $datarow[0];
            $datapartb = $datarow[1];
            $datapartc = $datarow[2];
        }
    }
}

循环意味着您每次都可以跳过第一行,并且可能会为此使用更少的资源,因为您没有那么多对象漂浮在周围

php.net page 也应该能帮到你

【讨论】:

  • 我想问题不是如何循环数据集。但是为什么某些选定的方法不起作用。
  • @u_mulder - 嗯,是的,这纯粹是实现相同结果的替代方法
  • 这是我们之前使用的方法,但我正在将其重构为更现代的方法,因此我可以有一些非常简单、可读的内容并删除循环内的条件。
  • @redigaffi - 有时,重新发明轮子并不是最好的做法,简单有时很棒,IMO 它归结为“为什么要修复未损坏的东西”:)
  • 是的,我知道这一点,但我总是努力改进所有方面。删除这些条件意味着更简单和更容易的代码。 (而且圈复杂度也更低)。但感谢您的帮助。
【解决方案2】:

这与 PHP 错误 65601 有关,建议添加 READ_AHEAD 标志将解决此问题。经过测试并按您的预期工作。

    $csvFile->setFlags(\SplFileObject::READ_CSV | \SplFileObject::READ_AHEAD);

另见SplFileObject + LimitIterator + offset

【讨论】:

    猜你喜欢
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多