A exceção com a mensagem de erro que você especificou é acionada em exatamente um local (código ligeiramente truncado para facilitar a leitura):
final public function __construct($source)
{
$this->_source = $source;
$this->_init();
// validate column names consistency
if (is_array($this->_colNames) && !empty($this->_colNames)) {
$this->_colQuantity = count($this->_colNames);
if (count(array_unique($this->_colNames)) != $this->_colQuantity) {
Mage::throwException(Mage::helper('importexport')->__('Column names have duplicates'));
}
}
}
Isso significa que count(array_unique($this->_colNames))
deve ser desigual para$this->_colQuantity
A $_colNames
matriz é configurada Mage_ImportExport_Model_Import_Adapter_Csv::rewind()
(que é chamada durante _init()
.
Mais uma vez, o código é ligeiramente truncado para facilitar a leitura:
public function rewind()
{
// rewind resource, reset column names, read first row as current
rewind($this->_fileHandler);
$this->_colNames = fgetcsv($this->_fileHandler, null, $this->_delimiter, $this->_enclosure);
}
O $_delimiter
está definido como ,
, o $_enclosure
está definido como "
.
Para tentar reproduzir o problema, se eu copiar o extrato CSV da sua pergunta para um arquivo chamado test.csv e executar o seguinte código:
$f = fopen('test.csv', 'r');
$names = fgetcsv($f, null, ',', '"');
$qty = count($names);
$uniqueQty = count(array_unique($names));
printf("%d records, %d unique records\n", $qty, $uniqueQty);
produz a seguinte saída:
29 records, 29 unique records
Isso significa que seu arquivo CSV está fundamentalmente correto. A diferença deve estar em outro lugar.
Observando como array_unique
funciona, há uma observação de como o tipo de manipulação dos elementos do array mudou no PHP 5.2.9: http://php.net/manual/en/function.array-unique.php#refsect1-function.array-unique -changelog
Para reproduzir o problema, executei novamente meu script de teste com o SORT_REGULAR
conjunto de opções, mas isso ainda dá o mesmo resultado (o que é lógico, pois a leitura de um arquivo pode fornecer apenas valores de sequência de caracteres).
No momento, acredito que a diferença deve estar no arquivo CSV que você está usando. Os caracteres de nova linha do Unix e do Windows ( \n
e \r\n
) são reconhecidos pelo fgetcsv()
comando, mas o antigo caractere de nova linha do estilo MacOS ( \r
) levaria realmente ao comportamento que você está enfrentando.
Não sei se esse é o motivo pelo qual você está enfrentando o problema, mas sugiro que verifique o arquivo CSV (novamente). Também pode ajudar se você fornecer um link de download em algum lugar para o arquivo não modificado (sem pastebin), para que todos os caracteres não imprimíveis sejam preservados.
Também pode ajudar se você postar a versão PHP que está usando.