0

我按照此处介绍的解决方案https://stackoverflow.com/a/36041188/11295637创建了一个新的 csv 文件并将大型 csv 文件的特定列提取到新文件中。但是,我收到此错误:未捕获的错误:在 null 上调用成员函数 insertOne()。

代码如下:

php

$new= Writer::createFromPath('path\to\file', 'w+');
$filename= Reader::createFromPath($filename, 'r');
          $filename->setOffset(1);
          $filename->each(function ($row) use ($indexes) {
            $new->insertOne($row);
            return true;
          });

问题是新变量未定义。我也试过

php
$new= Writer::createFromFileObject(new SplTempFileObject());

但我得到了同样的错误。

4

1 回答 1

0

在 PHP 中,如果要引用在函数外部定义的变量,则必须 (a)use在匿名函数签名中使用限定符或 (b) 在函数内部使用global语句。

在您的情况下,您有一个 use 限定符,但它引用了一个 variable $indexes。我在您的代码中没有看到 $indexes 变量,因此您需要将 $new 添加到该列表或将 $indexes 替换为 $new。

$new = Writer::createFromPath('path\to\file', 'w+');
$filename = Reader::createFromPath($filename, 'r');
$filename->setOffset(1);
$filename->each(function ($row) use ($new) {
    $new->insertOne($row);
    return true;
});

要仅选择变量中指定的索引$indexes,您应该从 $row 中选择某些键,然后重建一个新行。您可以使用array_fliparray_intersect_key来做到这一点。

// convert [cat, dog] => [cat => 0, dog => 1]
$indexKeys = array_flip($indexes);
$filename->each(function ($row) use ($new, $indexKeys) {
    $selectedCols = array_intersect_key($row, $indexKeys);
    $new->insertOne($selectedCols);
    return true;
});
于 2019-04-01T22:29:32.400 回答