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

9

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

Кто я могу это исправить?

"_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 года требует столбцов, которых нет даже в экспортированном файле. Поэтому я не уверен, каковы требуемые columen.

Версия PHP 5.2.17

PiTheNumber
источник
Сделайте экспорт и сравните, что у вас есть тот же набор столбцов.
user487772
Ну, у меня нет, но у меня есть необходимые столбцы, так что мне здесь не хватает?
PiTheNumber
Какой тип импорта вы используете?
user487772
/admin/import, Не старый поток данных.
PiTheNumber
Тогда большинство столбцов в вашем примере имеют неправильные заголовки
user487772

Ответы:

13

Исключение с сообщением об ошибке, которое вы указали, вызывается ровно в одном месте (код немного урезан для удобства чтения):

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

Vinai
источник
1
Это оно! Я использовал webhex.net, и оказалось, что в файле есть разрывы строк 0D MaxOS \ r. Я изменил его на \ r \ n и теперь он работает. Большое спасибо!
PiTheNumber
2
Вы также можете попробовать включить auto_detect_line_endings: ini_set ("auto_detect_line_endings", "1"), это рекомендуется PHP: php.net/manual/en/function.fgetcsv.php
Enrique
1

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

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

Джеймс Пелтон
источник
1

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

  1. Выберите диапазон ячеек, которые вы хотите проверить (в этом случае все ячейки в строке заголовка).
  2. На главной вкладке Excel выберите «Условное форматирование», «Выделить правила ячеек», а затем «Дублировать значения».
  3. Нажмите OK в диалоговом окне Duplicate Values, чтобы определить дубликаты значений.
  4. Дублирующиеся значения в списке теперь будут определены.

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

Code Commander
источник
0

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

Кристофер Кларк
источник