L'exception avec le message d'erreur que vous avez indiqué est déclenchée à exactement un endroit (code légèrement tronqué pour plus de lisibilité):
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'));
}
}
}
Cela signifie, count(array_unique($this->_colNames))
doit être différent de$this->_colQuantity
Le $_colNames
tableau est défini dans Mage_ImportExport_Model_Import_Adapter_Csv::rewind()
(qui est appelé pendant _init()
.
Une fois encore, le code est légèrement tronqué pour plus de lisibilité:
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);
}
Le $_delimiter
est réglé ,
, l' $_enclosure
est réglé "
.
Pour essayer de reproduire le problème, si je copie l'extrait CSV de votre question dans un fichier appelé test.csv et que j'exécute le code suivant:
$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);
il produit la sortie suivante:
29 records, 29 unique records
Cela signifie que votre fichier CSV est fondamentalement correct. La différence doit être ailleurs.
En regardant comment cela array_unique
fonctionne, il y a une note sur la façon dont la gestion des types d'éléments de tableau a changé en PHP 5.2.9: http://php.net/manual/en/function.array-unique.php#refsect1-function.array-unique -changelog
Pour reproduire le problème, j'ai relancé mon script de test avec le SORT_REGULAR
jeu d'options, mais cela donne toujours le même résultat (ce qui est logique, car la lecture d'un fichier ne peut donner que des valeurs de chaîne).
Pour le moment, je pense que la différence doit être dans le fichier CSV que vous utilisez. Les caractères de retour à la ligne Unix et Windows ( \n
et \r\n
) sont tous deux reconnus par la fgetcsv()
commande, mais l'ancien caractère de retour à la ligne de style MacOS ( \r
) entraînerait en fait le comportement que vous rencontrez.
Je ne peux pas savoir si c'est la raison pour laquelle vous rencontrez le problème, mais je vous suggère de vérifier le fichier CSV (à nouveau). Cela peut également être utile si vous fournissez un lien de téléchargement quelque part vers le fichier non modifié (pas de coller), afin que tous les caractères non imprimables soient conservés.
Il peut également être utile de publier la version PHP que vous utilisez.