如何在League Reader中跳过重复的CSV列(按标题)?

n1bvdmb6  于 7个月前  发布在  其他
关注(0)|答案(2)|浏览(69)

我使用league/csv:^9.6(9.6.2)。
我需要解析CSV文件,有很多列(150+),并提取少量(8)。这些列在偏移量方面是不固定的(位置未知),但他们有稳定的唯一标题-所以我想选择他们的标题,而不是偏移量。
但问题是:库抛出了一个关于重复标题的异常。有没有解决方案可以跳过它们并正确解析所有其他行?
或者任何变通办法如何剥离他们从文件之前使用这个库?位置和计数的重复是未知的事先。
谢谢你,谢谢

xv8emn3q

xv8emn3q1#

你可以自己Map列名。不要设置标题偏移量,这将使League返回带有整数键的行。
然后使用一个数组,包含你想要的列名,来构建索引的Map。我做了一个小的工作示例:

test.csv

name;;;age;;;;a;a;a;;;;
John;;;32;;;;;;;;;;
Jane;;;28;;;;;;;;;;

字符串

test.php

//The columns you want to extract
$columns = ['name', 'age'];

$reader = Reader::createFromPath('test.csv', 'r+');
$reader->setDelimiter(';');
$grab = [];

//Find the indexes
foreach ($reader->fetchOne() as $index => $column) {
    if (in_array($column, $columns)) {
        $grab[$column] = $index;
    }
}

foreach ($reader->getRecords() as $i => $row) {
    if ($i == 0) {
        continue;
    }

    $filteredRow = [];
    foreach ($grab as $column => $index) {
        $filteredRow[$column] = $row[$index];
    }

    //$filteredRow now contains the needed columns
    var_dump($filteredRow);
}

  • 输出:*
array(2) {
  ["name"]=> string(4) "John"
  ["age"]=> string(2) "32"
}
array(2) {
  ["name"]=> string(4) "Jane"
  ["age"]=> string(2) "28"
}

ffscu2ro

ffscu2ro2#

简化版!

$columns = ['name', 'age'];

$validColumns = array_intersect($reader->fetchOne(0), $columns);
$validIndices = array_flip(array_keys($validColumns));

foreach ($reader->getRecords() as $i => $row) {
    if ($i > 0) {
        $csvArray[] = array_combine( $validColumns, array_intersect_key( $row, $validIndices ));
    }
}

字符串

相关问题