我按照这里介绍的解决方案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());
但我得到了同样的错误。
在PHP中,如果要引用在函数外部定义的变量,则必须(a)在匿名函数签名中使用use
限定符或(b)在函数内使用global
语句。
在您的情况下,您有一个use限定符,但它引用了一个变量$indexes
。我没有在你的代码中看到$ indexes变量,所以你需要在该列表中添加$ new或者用$ new替换$ indexes。
$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_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;
});