Импорт: Имена столбцов имеют дубликаты


Импорт показывает сообщение об ошибке "Имена столбцов имеют дубликаты", но у меня нет дубликатов.

Кто может это исправить?

"_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

Author: PiTheNumber, 2013-06-12

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, которую используете.

 13
Author: Vinai, 2013-06-17 11:43:31

Я получал эту ошибку при редактировании и сохранении с помощью LibreOffice на моем Mac. Проблема была решена путем редактирования файла с помощью Google Диска, а затем ошибка исчезла.

Я предполагаю, что это связано с окончаниями строк Mac.

 1
Author: James Pelton, 2013-11-20 22:09:24

Если вы проверили кодировку новой строки и все еще испытываете проблемы, дважды проверьте, что у вас на самом деле нет повторяющегося имени столбца в вашем CSV. В Excel вы можете быстро выделить дубликаты с помощью этой техники:

  1. Выберите диапазон ячеек, которые вы хотите проверить (в данном случае все ячейки в строке заголовка).
  2. На вкладке Главная Excel выберите Условное форматирование, Выделите Правила ячеек, а затем Дублируйте значения.
  3. Нажмите кнопку ОК в диалоговом окне Повторяющиеся значения, чтобы определите повторяющиеся значения.
  4. Теперь будут идентифицированы повторяющиеся значения в списке.

В моем случае я перетащил формулу (непреднамеренно) в строку заголовка и перепутал свой заголовок.

 1
Author: Code Commander, 2018-02-13 01:28:34

Вы также можете сохранить файл .csv (используя Mac) в формате .csv для Windows. Это исправит сообщение об ошибке повторяющихся столбцов. Я работаю на Mac, и вот как я обхожу эти ошибки импорта. Надеюсь, это сработает для вас.

 0
Author: Christopher Clarke, 2014-12-12 19:57:58