LimitIterator偏移量1,包含2个元素

时间:2018-06-27 11:23:10

标签: php csv

我面临的问题是我有一个读取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行,则该代码将很好地工作。

有什么想法吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

我个人将使用以下的fopen和fgetcsv函数;

db.getCollection('collection').find(
    { 
        $or: [ 
                {users:  { $type: [1, 16, 18, 19] } },
                {users:  { $regex: /^[0-9]+$/ }}
        ]
    }
)

循环意味着您每次可以只跳过第一行,并且可能会使用较少的资源,因为您没有浮动的对象

php.net page也应该为您提供帮助

答案 1 :(得分:0)

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

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

另见SplFileObject + LimitIterator + offset