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 $_colNames
matriz 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 $_delimiter
se establece en ,
, el $_enclosure
se 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_unique
funciona, 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_REGULAR
conjunto 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 ( \n
y \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.