Importer: les noms de colonne ont des doublons


9

L'importation affiche le message d'erreur "Les noms de colonne ont des doublons" mais je n'ai pas de doublons.

Qui puis-je résoudre ce problème?

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

Télécharger un fichier

Je me suis assuré que tous mes champs existent également dans les csv exportés. Suis-je en train de manquer certaines lignes obligatoires? J'ai essayé de vérifier mais cette page wiki de 2012 nécessite des colonnes qui ne sont même pas dans le fichier exporté. Je ne sais donc pas quels sont les columens requis.

La version PHP est 5.2.17


Faites une exportation et comparez que vous avez le même ensemble de colonnes.
user487772

Eh bien, non, mais j'ai les colonnes nécessaires, alors qu'est-ce qui me manque ici?
PiTheNumber

Quel type d'importation utilisez-vous?
user487772

Le /admin/import, pas l'ancien flux de données.
PiTheNumber

Ensuite, la plupart des colonnes de votre exemple ont des titres incorrects
user487772

Réponses:


13

L'exception avec le message d'erreur que vous avez indiqué est déclenchée à exactement un endroit (code légèrement tronqué pour plus de lisibilité):

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

Cela signifie, count(array_unique($this->_colNames))doit être différent de$this->_colQuantity

Le $_colNamestableau est défini dans Mage_ImportExport_Model_Import_Adapter_Csv::rewind()(qui est appelé pendant _init().
Une fois encore, le code est légèrement tronqué pour plus de lisibilité:

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

Le $_delimiterest réglé ,, l' $_enclosureest réglé ".

Pour essayer de reproduire le problème, si je copie l'extrait CSV de votre question dans un fichier appelé test.csv et que j'exécute le code suivant:

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

il produit la sortie suivante:

29 records, 29 unique records

Cela signifie que votre fichier CSV est fondamentalement correct. La différence doit être ailleurs.
En regardant comment cela array_uniquefonctionne, il y a une note sur la façon dont la gestion des types d'éléments de tableau a changé en PHP 5.2.9: http://php.net/manual/en/function.array-unique.php#refsect1-function.array-unique -changelog

Pour reproduire le problème, j'ai relancé mon script de test avec le SORT_REGULARjeu d'options, mais cela donne toujours le même résultat (ce qui est logique, car la lecture d'un fichier ne peut donner que des valeurs de chaîne).

Pour le moment, je pense que la différence doit être dans le fichier CSV que vous utilisez. Les caractères de retour à la ligne Unix et Windows ( \net \r\n) sont tous deux reconnus par la fgetcsv()commande, mais l'ancien caractère de retour à la ligne de style MacOS ( \r) entraînerait en fait le comportement que vous rencontrez.

Je ne peux pas savoir si c'est la raison pour laquelle vous rencontrez le problème, mais je vous suggère de vérifier le fichier CSV (à nouveau). Cela peut également être utile si vous fournissez un lien de téléchargement quelque part vers le fichier non modifié (pas de coller), afin que tous les caractères non imprimables soient conservés.

Il peut également être utile de publier la version PHP que vous utilisez.


1
C'est ça! J'ai utilisé webhex.net et il s'est avéré que le fichier a des sauts de ligne 0D MaxOS \ r. Je l'ai changé en \ r \ n et maintenant ça marche. Merci beaucoup!
PiTheNumber

2
Vous pouvez également essayer d'activer auto_detect_line_endings: ini_set ("auto_detect_line_endings", "1"), il est recommandé par PHP: php.net/manual/en/function.fgetcsv.php
Enrique

1

Je recevais cette erreur lors de l'édition et de l'enregistrement à l'aide de LibreOffice sur mon Mac. Le problème a été résolu en modifiant le fichier à l'aide de Google Drive à la place, puis l'erreur a disparu.

Je suppose que cela est dû aux fins de ligne Mac.


1

Si vous avez vérifié l'encodage de nouvelle ligne et que vous rencontrez toujours des problèmes, vérifiez que vous n'avez pas réellement de nom de colonne en double dans votre CSV. Dans Excel, vous pouvez rapidement mettre en évidence les doublons avec cette technique:

  1. Sélectionnez la plage de cellules que vous souhaitez tester (dans ce cas, toutes les cellules de la ligne d'en-tête).
  2. Dans l'onglet Accueil d'Excel, choisissez Mise en forme conditionnelle, Règles de cellules en surbrillance, puis Valeurs en double.
  3. Cliquez sur OK dans la boîte de dialogue Valeurs en double pour identifier les valeurs en double.
  4. Les valeurs en double dans la liste seront désormais identifiées.

Dans mon cas, j'avais glissé une formule (involontairement) dans la ligne d'en-tête et foiré mon en-tête.


0

Vous pouvez également enregistrer le fichier .csv (à l'aide d'un Mac) en tant que .csv formaté Windows. Cela corrigera le message d'erreur des colonnes en double. Je travaille sur un Mac et voici comment contourner ces erreurs d'importation. J'espère que ça marche pour toi.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.