Імпорт: назви стовпців мають дублікати


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 року вимагає стовпців, яких немає навіть у експортованому файлі. Тож я не впевнений, які потрібні колони.

Версія PHP - 5.2.17


Зробіть експорт і порівняйте, що у вас однаковий набір стовпців.
user487772

Ну, я не маю, але в мене є потрібні стовпці, і чого я тут пропускаю?
PiTheNumber

Який тип імпорту ви використовуєте?
user487772

The /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, який ви використовуєте. У команді розпізнаються символи ( \nі \r\n) для Unix та Windows Newline ( та ) fgetcsv(), але старий символ нового рядка стилю MacOS ( \r) фактично призведе до поведінки, яку ви відчуваєте.

Я не можу знати, чи з цієї причини у вас виникають проблеми, але я пропоную вам переглянути файл CSV (ще раз). Це також може допомогти, якщо ви надаєте посилання для завантаження десь до немодифікованого файлу (без пастіна), тому будь-які символи, що не друкуються, зберігаються.

Це також може допомогти, якщо ви опублікуєте використовувану версію PHP.


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 Диска, після чого помилка усунулася.

Я припускаю, що це пов'язано із закінченнями рядків Mac.


1

Якщо ви перевірили кодування нового рядка і у вас все ще виникають проблеми, двічі перевірте, чи не є насправді у вашому CSV дублікатом стовпця ім’я. У Excel ви можете швидко виділити дублікати за допомогою цієї техніки:

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

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


0

Ви також можете зберегти .csv файл (за допомогою Mac) у форматі Windows. Це виправить повідомлення про помилку дублікатів стовпців. Я працюю на Mac, і саме так я обходжу ці помилки імпорту. Сподіваюся, це працює для вас.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.