Die Ausnahme mit der von Ihnen angegebenen Fehlermeldung wird an genau einer Stelle ausgelöst (Code aus Gründen der Lesbarkeit leicht abgeschnitten):
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'));
}
}
}
Dies bedeutet, count(array_unique($this->_colNames))
muss ungleich sein$this->_colQuantity
Das $_colNames
Array wird in gesetzt Mage_ImportExport_Model_Import_Adapter_Csv::rewind()
(was während aufgerufen wird _init()
.
Wiederum wird der Code aus Gründen der Lesbarkeit leicht abgeschnitten:
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);
}
Das $_delimiter
ist eingestellt auf ,
, das $_enclosure
ist eingestellt auf "
.
Um zu versuchen, das Problem zu reproduzieren, kopiere ich den CSV-Auszug aus Ihrer Frage in eine Datei namens test.csv und führe den folgenden Code aus:
$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);
es erzeugt die folgende Ausgabe:
29 records, 29 unique records
Dies bedeutet, dass Ihre CSV-Datei grundsätzlich in Ordnung ist. Der Unterschied muss woanders sein.
In Bezug auf die Funktionsweise array_unique
gibt es einen Hinweis darauf, wie sich die Typbehandlung von Array-Elementen in PHP 5.2.9 geändert hat: http://php.net/manual/en/function.array-unique.php#refsect1-function.array-unique -Änderungsprotokoll
Um das Problem zu reproduzieren, habe ich mein Testskript mit der festgelegten SORT_REGULAR
Option erneut ausgeführt, aber dies ergibt immer noch das gleiche Ergebnis (was logisch ist, da das Lesen einer Datei nur Zeichenfolgenwerte ergeben kann).
Derzeit glaube ich, dass der Unterschied in der von Ihnen verwendeten CSV-Datei liegen muss. Das Unix- und das Windows-Zeilenumbruchzeichen ( \n
und \r\n
) werden beide vom fgetcsv()
Befehl erkannt , aber das alte Zeilenumbruchzeichen ( \r
) im MacOS-Stil ( ) würde tatsächlich zu dem aufgetretenen Verhalten führen.
Ich kann nicht wissen, ob dies der Grund ist, warum das Problem auftritt, aber ich schlage vor, dass Sie die CSV-Datei (erneut) überprüfen. Es kann auch hilfreich sein, wenn Sie irgendwo einen Download-Link zur nicht geänderten Datei bereitstellen (kein Pastebin), damit nicht druckbare Zeichen erhalten bleiben.
Es kann auch hilfreich sein, wenn Sie die von Ihnen verwendete PHP-Version veröffentlichen.