我使用league/csv:^9.6(9.6.2)。我需要解析CSV文件,有很多列(150+),并提取少量(8)。这些列在偏移量方面是不固定的(位置未知),但他们有稳定的唯一标题-所以我想选择他们的标题,而不是偏移量。但问题是:库抛出了一个关于重复标题的异常。有没有解决方案可以跳过它们并正确解析所有其他行?或者任何变通办法如何剥离他们从文件之前使用这个库?位置和计数的重复是未知的事先。谢谢你,谢谢
league/csv:^9.6
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" }
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 )); } }
2条答案
按热度按时间xv8emn3q1#
你可以自己Map列名。不要设置标题偏移量,这将使League返回带有整数键的行。
然后使用一个数组,包含你想要的列名,来构建索引的Map。我做了一个小的工作示例:
test.csv
字符串
test.php
型
型
ffscu2ro2#
简化版!
字符串