Wyjątek z podanym komunikatem o błędzie jest uruchamiany dokładnie w jednym miejscu (nieznacznie obcięty kod dla czytelności):
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'));
}
}
}
Oznacza to, że count(array_unique($this->_colNames))
muszą być nierówne$this->_colQuantity
$_colNames
Tablica jest ustawiona na Mage_ImportExport_Model_Import_Adapter_Csv::rewind()
(co nazywa się w czasie _init()
.
Po raz kolejny kod jest lekko obcięte dla czytelności:
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);
}
$_delimiter
Jest ustawiony ,
, $_enclosure
jest ustawiony "
.
Aby spróbować odtworzyć problem, skopiuję fragment CSV z pytania do pliku o nazwie test.csv i uruchomię następujący kod:
$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);
produkuje następujące dane wyjściowe:
29 records, 29 unique records
Oznacza to, że Twój plik CSV jest zasadniczo w porządku. Różnica musi być gdzie indziej.
Patrząc na to, jak array_unique
działa, można zauważyć, jak zmieniła się obsługa typów elementów tablicy w PHP 5.2.9: http://php.net/manual/en/function.array-unique.php#refsect1-function.array-unique dziennik zmian
Aby odtworzyć problem, uruchomiłem ponownie skrypt testowy z SORT_REGULAR
zestawem opcji, ale nadal daje to ten sam wynik (co jest logiczne, ponieważ odczyt pliku może dać wartości ciągu).
W tej chwili uważam, że różnica musi być w używanym pliku CSV. Znaki nowego wiersza w systemach Unix i Windows ( \n
i \r\n
) są rozpoznawane przez fgetcsv()
polecenie, ale stary znak nowej linii w systemie MacOS ( \r
) w rzeczywistości prowadziłby do występującego zachowania.
Nie wiem, czy to jest powód tego problemu, ale sugeruję sprawdzenie pliku CSV (ponownie). Może to również pomóc, jeśli podasz gdzieś link do niezmodyfikowanego pliku (bez wklejenia), aby wszystkie znaki niedrukowalne zostały zachowane.
Może to również pomóc, jeśli opublikujesz wersję PHP, której używasz.