Import: nazwy kolumn mają duplikaty

9

Import pokazuje komunikat o błędzie „Nazwy kolumn mają duplikaty”, ale nie mam żadnych duplikatów.

Komu mogę to naprawić?

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

Pobieranie pliku

Upewniłem się, że wszystkie moje pola istnieją również w eksportowanym pliku CSV. Czy brakuje niektórych wymaganych wierszy? Próbowałem sprawdzić, ale ta strona wiki z 2012 roku wymaga kolumn, których nawet nie ma w eksportowanym pliku. Nie jestem więc pewien, jakie są wymagane kolumny.

Wersja PHP to 5.2.17

PiTheNumber
źródło
Wykonaj eksport i porównaj, czy masz ten sam zestaw kolumn.
user487772,
Cóż, nie mam, ale mam potrzebne kolumny, więc czego tu brakuje?
PiTheNumber
Jakiego rodzaju importu używasz?
user487772,
/admin/import, Nie stara przepływ danych.
PiTheNumber
Wówczas większość kolumn w twoim przykładzie ma błędne tytuły
user487772

Odpowiedzi:

13

Wyjątek z podanym komunikatem o błędzie jest uruchamiany dokładnie w jednym miejscu (nieznacznie obcięty kod dla czytelności):

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'));
        }
    }
}

Oznacza to, że count(array_unique($this->_colNames))muszą być nierówne$this->_colQuantity

$_colNamesTablica jest ustawiona na Mage_ImportExport_Model_Import_Adapter_Csv::rewind()(co nazywa się w czasie _init().
Po raz kolejny kod jest lekko obcięte dla czytelności:

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);
}

$_delimiterJest ustawiony ,, $_enclosurejest ustawiony ".

Aby spróbować odtworzyć problem, skopiuję fragment CSV z pytania do pliku o nazwie test.csv i uruchomię następujący kod:

$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);

produkuje następujące dane wyjściowe:

29 records, 29 unique records

Oznacza to, że Twój plik CSV jest zasadniczo w porządku. Różnica musi być gdzie indziej.
Patrząc na to, jak array_uniquedziała, można zauważyć, jak zmieniła się obsługa typów elementów tablicy w PHP 5.2.9: http://php.net/manual/en/function.array-unique.php#refsect1-function.array-unique dziennik zmian

Aby odtworzyć problem, uruchomiłem ponownie skrypt testowy z SORT_REGULARzestawem opcji, ale nadal daje to ten sam wynik (co jest logiczne, ponieważ odczyt pliku może dać wartości ciągu).

W tej chwili uważam, że różnica musi być w używanym pliku CSV. Znaki nowego wiersza w systemach Unix i Windows ( \ni \r\n) są rozpoznawane przez fgetcsv()polecenie, ale stary znak nowej linii w systemie MacOS ( \r) w rzeczywistości prowadziłby do występującego zachowania.

Nie wiem, czy to jest powód tego problemu, ale sugeruję sprawdzenie pliku CSV (ponownie). Może to również pomóc, jeśli podasz gdzieś link do niezmodyfikowanego pliku (bez wklejenia), aby wszystkie znaki niedrukowalne zostały zachowane.

Może to również pomóc, jeśli opublikujesz wersję PHP, której używasz.

Vinai
źródło
1
Otóż ​​to! Użyłem webhex.net i okazało się, że plik ma przerwania linii 0D MaxOS \ r. Zmieniłem to na \ r \ n i teraz działa. Wielkie dzięki!
PiTheNumber
2
Możesz także spróbować włączyć opcję
Enrique
1

Ten błąd pojawiał się podczas edycji i zapisywania za pomocą LibreOffice na moim komputerze Mac. Problem został rozwiązany przez edycję pliku za pomocą Dysku Google, a następnie błąd zniknął.

Zakładam, że jest to spowodowane zakończeniami linii Mac.

James Pelton
źródło
1

Jeśli sprawdziłeś kodowanie nowej linii i nadal masz problemy, sprawdź dwukrotnie, czy w pliku CSV nie ma zduplikowanej nazwy kolumny. W programie Excel możesz szybko wyróżnić duplikaty za pomocą tej techniki:

  1. Wybierz zakres komórek, które chcesz przetestować (w tym przypadku wszystkie komórki w wierszu nagłówka).
  2. Na karcie Narzędzia główne programu Excel wybierz Formatowanie warunkowe, Podświetl reguły komórek, a następnie Zduplikuj wartości.
  3. Kliknij przycisk OK w oknie dialogowym Zduplikowane wartości, aby zidentyfikować zduplikowane wartości.
  4. Zduplikowane wartości na liście zostaną teraz zidentyfikowane.

W moim przypadku przeciągnąłem formułę (nieumyślnie) do wiersza nagłówka i pomieszałem nagłówek.

Code Commander
źródło
0

Możesz również zapisać plik .csv (za pomocą komputera Mac) jako plik .csv w formacie Windows. To naprawi komunikat o błędzie zduplikowanych kolumn. Pracuję na komputerze Mac i w ten sposób omijam te błędy importu. Mam nadzieję, że Ci się uda.

Christopher Clarke
źródło