Импорт: Имена столбцов имеют дубликаты
Импорт показывает сообщение об ошибке "Имена столбцов имеют дубликаты", но у меня нет дубликатов.
Кто может это исправить?
"_type","sku","has_options","name","image","small_image","thumbnail","url_key","url_path","price","manufacturer","status","tax_class_id","visibility","description","short_description","gift_message_available","qty","min_qty","is_qty_decimal","backorders","min_sale_qty","max_sale_qty","is_in_stock","notify_stock_qty","manage_stock","qty_increments","enable_qty_increments"
"simple","1174407","0","BCI-15BK Tintenpatrone schwarz","","","","","","22.000","Canon","Enabled","none","Catalogue,Search","BCI-15BK Tintenpatrone schwarz, 2er-Pack, für I70 NSTintenpatronenOriginalML","BCI-15BK Tintenpatrone schwarz, 2er-Pack, für I70 NSTintenpatronenOriginalML","","0","","","0","1","","","","","","0"
Я убедился, что все мои поля также существуют в экспортированном csv. Мне не хватает некоторых обязательных строк? Я попытался проверить, но для этой вики-страницы 2012 года требуются столбцы, которых даже нет в экспортированном файле. Поэтому я не уверен, какие требуются столбцы.
Версия PHP 5.2.17
4 answers
Исключение с сообщением об ошибке, которое вы указали, срабатывает ровно в одном месте (код слегка усечен для удобства чтения):
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 .массив-уникальный.php#refsect1-функция.массив-уникальный-список изменений
Для воспроизведения проблема, я повторно запустил свой тестовый скрипт с установленным параметром SORT_REGULAR
, но это все равно дает тот же результат (что логично, поскольку чтение файла может давать только строковые значения).
На данный момент я считаю, что разница должна быть в используемом вами CSV-файле. Символы новой строки Unix и Windows (\n
и \r\n
) распознаются командой fgetcsv()
, но старый символ новой строки в стиле macOS (\r
) фактически приведет к тому поведению, которое вы испытываете.
Я не могу знать если это причина, по которой у вас возникла проблема, но я предлагаю вам проверить CSV-файл (еще раз). Также может помочь, если вы предоставите ссылку для загрузки где-нибудь на неизмененный файл (без вставки), чтобы все непечатаемые символы были сохранены.
Также может помочь, если вы опубликуете версию PHP, которую используете.
Я получал эту ошибку при редактировании и сохранении с помощью LibreOffice на моем Mac. Проблема была решена путем редактирования файла с помощью Google Диска, а затем ошибка исчезла.
Я предполагаю, что это связано с окончаниями строк Mac.
Если вы проверили кодировку новой строки и все еще испытываете проблемы, дважды проверьте, что у вас на самом деле нет повторяющегося имени столбца в вашем CSV. В Excel вы можете быстро выделить дубликаты с помощью этой техники:
- Выберите диапазон ячеек, которые вы хотите проверить (в данном случае все ячейки в строке заголовка).
- На вкладке Главная Excel выберите Условное форматирование, Выделите Правила ячеек, а затем Дублируйте значения.
- Нажмите кнопку ОК в диалоговом окне Повторяющиеся значения, чтобы определите повторяющиеся значения.
- Теперь будут идентифицированы повторяющиеся значения в списке.
В моем случае я перетащил формулу (непреднамеренно) в строку заголовка и перепутал свой заголовок.
Вы также можете сохранить файл .csv (используя Mac) в формате .csv для Windows. Это исправит сообщение об ошибке повторяющихся столбцов. Я работаю на Mac, и вот как я обхожу эти ошибки импорта. Надеюсь, это сработает для вас.