LimitIterator 偏移量 1 和 2 个元素

Posted

技术标签:

【中文标题】LimitIterator 偏移量 1 和 2 个元素【英文标题】:LimitIterator offset 1 with 2 elements 【发布时间】: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 吗?感谢您的帮助 【参考方案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

【讨论】:

以上是关于LimitIterator 偏移量 1 和 2 个元素的主要内容,如果未能解决你的问题,请参考以下文章

了解位和偏移量的 C 要求 [关闭]

Kafka 日志中缺少偏移量 - 简单消费者无法继续

Kafka消息的偏移量和顺序消费原理

基于日期偏移量在 T-SQL 中进行透视

确定给定地址的页码和偏移量

如何获取 kafka 主题分区的最后/结束偏移量?