Исключение с сообщением об ошибке, которое вы указали, вызывается ровно в одном месте (код немного урезан для удобства чтения):
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'));
}
}
}
Это значит, count(array_unique($this->_colNames))
должно быть неравным$this->_colQuantity
$_colNames
Массива устанавливаются в Mage_ImportExport_Model_Import_Adapter_Csv::rewind()
(который вызывается в процессе _init()
.
Еще раз, код немного обрезан для удобства чтения:
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
установлено на ,
, значение $_enclosure
установлено на "
.
Чтобы попытаться воспроизвести проблему, если я скопирую извлечение CSV из вашего вопроса в файл с именем test.csv и запустите следующий код:
$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);
он производит следующий вывод:
29 records, 29 unique records
Это означает, что ваш CSV-файл в целом в порядке. Разница должна быть где-то еще.
Если посмотреть на то, как это array_unique
работает, заметим, как изменилась обработка типов элементов массива в PHP 5.2.9: http://php.net/manual/en/function.array-unique.php#refsect1-function.array-unique. -changelog
Чтобы воспроизвести проблему, я повторно запустил свой тестовый сценарий с SORT_REGULAR
набором параметров, но это все равно дает тот же результат (что логично, поскольку чтение только файла может дать строковые значения).
В настоящее время я считаю, что разница должна быть в используемом вами файле CSV. Символы новой строки Unix и Windows ( \n
и \r\n
) распознаются fgetcsv()
командой, но символ новой строки в старом стиле MacOS ( \r
) фактически приводит к тому поведению, которое вы испытываете.
Я не могу знать, является ли это причиной того, что у вас возникла проблема, но я предлагаю вам проверить файл CSV (снова). Также может помочь, если вы предоставите ссылку на скачивание где-нибудь на неизмененный файл (без вставки), поэтому все непечатаемые символы сохранятся.
Это также может помочь, если вы разместите версию PHP, которую вы используете.