我按照这里介绍的解决方案 https://stackoverflow.com/a/36041188/11295637 创建一个新的 csv 文件并将大型 csv 文件的特定列提取到新文件中。但是,我收到此错误:未捕获错误:在 null 上调用成员函数 insertOne((。
代码如下:
php
$new= Writer::createFromPath('pathtofile', '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());
但我得到了同样的错误。
在 PHP 中,如果要引用在函数外部定义的变量,则必须 (a( 在匿名函数签名中使用 use
限定符或 (b( 在函数中使用 global
语句。
在您的情况下,您有一个 use 限定符,但它引用了一个变量$indexes
。我在代码中看不到$indexes变量,因此您需要将$new添加到该列表中或$indexes替换为$new。
$new = Writer::createFromPath('pathtofile', 'w+');
$filename = Reader::createFromPath($filename, 'r');
$filename->setOffset(1);
$filename->each(function ($row) use ($new) {
$new->insertOne($row);
return true;
});
若要仅选择$indexes
变量中指定的索引,应从$row中选择某些键,然后重新生成新行。您可以使用array_flip和array_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;
});