Importa: i nomi delle colonne hanno duplicati


9

L'importazione mostra il messaggio di errore "I nomi delle colonne hanno duplicati" ma non ho duplicati.

Chi posso risolvere questo?

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

Download file

Mi sono assicurato che tutti i miei campi esistessero anche nel CSV esportato. Mi mancano alcune righe richieste? Ho provato a controllare ma questa pagina wiki del 2012 richiede colonne che non sono nemmeno nel file esportato. Quindi non sono sicuro di quali siano i columeni richiesti.

La versione di PHP è la 5.2.17


Esegui un'esportazione e confronta che hai lo stesso set di colonne.
user487772,

Bene, non ho ma ho le colonne necessarie, quindi cosa mi manca qui?
PiTheNumber,

Che tipo di importazione stai usando?
user487772

Il /admin/import, non il vecchio flusso di dati.
PiTheNumber

Quindi la maggior parte delle colonne nell'esempio ha titoli errati
user487772

Risposte:


13

L'eccezione con il messaggio di errore che hai dichiarato viene attivata esattamente in un punto (codice leggermente troncato per leggibilità):

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

Ciò significa che count(array_unique($this->_colNames))deve essere ineguale$this->_colQuantity

L' $_colNamesarray è impostato su Mage_ImportExport_Model_Import_Adapter_Csv::rewind()(che viene chiamato durante _init().
Ancora una volta, il codice viene leggermente troncato per essere leggibile:

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

Il $_delimiterè impostato ,, il $_enclosureè impostato ".

Per provare a riprodurre il problema, se copio l'estratto CSV dalla tua domanda in un file chiamato test.csv ed eseguo il seguente codice:

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

produce il seguente output:

29 records, 29 unique records

Ciò significa che il tuo file CSV è fondamentalmente a posto. La differenza deve essere altrove.
Guardando come array_uniquefunziona, c'è una nota su come la gestione del tipo degli elementi dell'array è cambiata in PHP 5.2.9: http://php.net/manual/en/function.array-unique.php#refsect1-function.array-unique -changelog

Per riprodurre il problema, ho rieseguito il mio script di test con l' SORT_REGULARopzione impostata, ma ciò fornisce comunque lo stesso risultato (che è logico, poiché la lettura di un file può solo fornire valori di stringa).

Al momento credo che la differenza debba essere nel file CSV che stai utilizzando. I caratteri newline Unix e Windows ( \ne \r\n) sono entrambi riconosciuti dal fgetcsv()comando, ma il vecchio carattere newline in stile MacOS ( \r) porterebbe effettivamente al comportamento riscontrato.

Non posso sapere se questo è il motivo per cui stai riscontrando il problema, ma ti suggerisco di controllare il file CSV (di nuovo). Potrebbe anche essere utile se fornisci un link per il download da qualche parte al file non modificato (no pastebin), quindi tutti i caratteri non stampabili vengono conservati.

Potrebbe anche essere utile se pubblichi la versione di PHP che stai utilizzando.


1
Questo è tutto! Ho usato webhex.net e si è scoperto che il file ha interruzioni di linea 0D MaxOS. L'ho cambiato in \ r \ n e ora funziona. Molte grazie!
PiTheNumber,

2
Puoi anche provare ad abilitare auto_detect_line_endings: ini_set ("auto_detect_line_endings", "1"), è consigliato da PHP: php.net/manual/en/function.fgetcsv.php
Enrique

1

Stavo ricevendo questo errore durante la modifica e il salvataggio con LibreOffice sul mio Mac. Il problema è stato risolto modificando invece il file utilizzando Google Drive, quindi l'errore è scomparso.

Presumo sia dovuto alle terminazioni di linea del Mac.


1

Se hai verificato la codifica della nuova riga e hai ancora problemi, verifica di non avere effettivamente un nome di colonna duplicato nel tuo CSV. In Excel puoi evidenziare rapidamente i duplicati con questa tecnica:

  1. Seleziona l'intervallo di celle che desideri testare (in questo caso tutte le celle nella riga di intestazione).
  2. Nella scheda Home di Excel, seleziona Formattazione condizionale, Evidenzia regole celle e quindi Valori duplicati.
  3. Fare clic su OK nella finestra di dialogo Valori duplicati per identificare i valori duplicati.
  4. I valori duplicati nell'elenco verranno ora identificati.

Nel mio caso avevo trascinato una formula (involontariamente) nella riga dell'intestazione e incasinato la mia intestazione.


0

Puoi anche salvare il file .csv (usando un Mac) come .csv formattato di Windows. Ciò risolverà il messaggio di errore delle colonne duplicate. Lavoro su un Mac e questo è il modo per aggirare questi errori di importazione. Spero che funzioni per te.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.