Importar: los nombres de columna tienen duplicados


9

Importar muestra el mensaje de error "Los nombres de columna tienen duplicados" pero no tengo ningún duplicado.

¿A quién puedo arreglar esto?

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

Descargar archivo

Me aseguré de que todos mis campos también existan en csv exportado. ¿Me faltan algunas filas obligatorias? Traté de verificar pero esta página wiki de 2012 requiere columnas que ni siquiera están en el archivo exportado. Por lo tanto, no estoy seguro de cuáles son las columnas requeridas.

La versión de PHP es 5.2.17


Realice una exportación y compare que tiene el mismo conjunto de columnas.
user487772

Bueno, no, pero tengo las columnas necesarias, ¿qué me estoy perdiendo aquí?
PiTheNumber

¿Qué tipo de importación estás usando?
user487772

El /admin/import, no el antiguo flujo de datos.
PiTheNumber

Entonces, la mayoría de las columnas en su ejemplo tienen títulos incorrectos
user487772

Respuestas:


13

La excepción con el mensaje de error que indicó se activa exactamente en un lugar (código ligeramente truncado para facilitar la lectura):

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

Esto significa que count(array_unique($this->_colNames))debe ser desigual a$this->_colQuantity

La $_colNamesmatriz está configurada Mage_ImportExport_Model_Import_Adapter_Csv::rewind()(que se llama durante _init().
Una vez más, el código está ligeramente truncado para facilitar la lectura:

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

El $_delimiterse establece en ,, el $_enclosurese establece en ".

Para intentar reproducir el problema, si copio el extracto CSV de su pregunta en un archivo llamado test.csv y ejecuto el siguiente código:

$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 el siguiente resultado:

29 records, 29 unique records

Esto significa que su archivo CSV está fundamentalmente bien. La diferencia debe estar en otro lugar.
Mirando cómo array_uniquefunciona, hay una nota de cómo cambió el manejo de tipos de elementos de matriz en PHP 5.2.9: http://php.net/manual/en/function.array-unique.php#refsect1-function.array-unique -changelog

Para reproducir el problema, volví a ejecutar mi script de prueba con el SORT_REGULARconjunto de opciones, pero esto todavía da el mismo resultado (lo cual es lógico, ya que leer un archivo solo puede dar valores de cadena).

En este momento, creo que la diferencia debe estar en el archivo CSV que está utilizando. Los caracteres de nueva línea de Unix y Windows ( \ny \r\n) son reconocidos por el fgetcsv()comando, pero el antiguo carácter de nueva línea de estilo MacOS ( \r) en realidad conduciría al comportamiento que está experimentando.

No puedo saber si esa es la razón por la que está experimentando el problema, pero le sugiero que revise el archivo CSV (nuevamente). También podría ayudar si proporciona un enlace de descarga en algún lugar del archivo no modificado (sin pastebin), de modo que se conservan los caracteres no imprimibles.

También podría ayudar si publica la versión de PHP que está utilizando.


1
¡Eso es! Solía webhex.net y resultó que el archivo tiene una línea 0D MAXOS rompe \ r. Lo cambié a \ r \ n y ahora funciona. ¡Muchas gracias!
PiTheNumber

2
También puede intentar habilitar auto_detect_line_endings: ini_set ("auto_detect_line_endings", "1"), es recomendado por PHP: php.net/manual/en/function.fgetcsv.php
Enrique

1

Recibí este error al editar y guardar usando LibreOffice en mi Mac. El problema se resolvió editando el archivo usando Google Drive, luego el error desapareció.

Supongo que se debe a los finales de línea de Mac.


1

Si verificó la codificación de nueva línea y aún tiene problemas, verifique que en realidad no tenga un nombre de columna duplicado en su CSV. En Excel, puede resaltar rápidamente los duplicados con esta técnica:

  1. Seleccione el rango de celdas que desea probar (en este caso, todas las celdas de la fila del encabezado).
  2. En la pestaña Inicio de Excel, elija Formato condicional, Resaltar reglas de celdas y luego Duplicar valores.
  3. Haga clic en Aceptar dentro del cuadro de diálogo Valores duplicados para identificar los valores duplicados.
  4. Ahora se identificarán los valores duplicados en la lista.

En mi caso, había arrastrado una fórmula (sin querer) a la fila del encabezado y estropeé mi encabezado.


0

También puede guardar el archivo .csv (usando una Mac) como un .csv con formato de Windows. Esto solucionará el mensaje de error de columnas duplicadas. Trabajo en una Mac y así es como evito estos errores de importación. Espero que funcione para ti.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.