L'eccezione con il messaggio di errore che hai dichiarato viene attivata esattamente in un punto (codice leggermente troncato per leggibilità):
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'));
}
}
}
Ciò significa che count(array_unique($this->_colNames))
deve essere ineguale$this->_colQuantity
L' $_colNames
array è impostato su Mage_ImportExport_Model_Import_Adapter_Csv::rewind()
(che viene chiamato durante _init()
.
Ancora una volta, il codice viene leggermente troncato per essere leggibile:
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);
}
Il $_delimiter
è impostato ,
, il $_enclosure
è impostato "
.
Per provare a riprodurre il problema, se copio l'estratto CSV dalla tua domanda in un file chiamato test.csv ed eseguo il seguente codice:
$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);
produce il seguente output:
29 records, 29 unique records
Ciò significa che il tuo file CSV è fondamentalmente a posto. La differenza deve essere altrove.
Guardando come array_unique
funziona, c'è una nota su come la gestione del tipo degli elementi dell'array è cambiata in PHP 5.2.9: http://php.net/manual/en/function.array-unique.php#refsect1-function.array-unique -changelog
Per riprodurre il problema, ho rieseguito il mio script di test con l' SORT_REGULAR
opzione impostata, ma ciò fornisce comunque lo stesso risultato (che è logico, poiché la lettura di un file può solo fornire valori di stringa).
Al momento credo che la differenza debba essere nel file CSV che stai utilizzando. I caratteri newline Unix e Windows ( \n
e \r\n
) sono entrambi riconosciuti dal fgetcsv()
comando, ma il vecchio carattere newline in stile MacOS ( \r
) porterebbe effettivamente al comportamento riscontrato.
Non posso sapere se questo è il motivo per cui stai riscontrando il problema, ma ti suggerisco di controllare il file CSV (di nuovo). Potrebbe anche essere utile se fornisci un link per il download da qualche parte al file non modificato (no pastebin), quindi tutti i caratteri non stampabili vengono conservati.
Potrebbe anche essere utile se pubblichi la versione di PHP che stai utilizzando.