Importar: os nomes das colunas têm duplicatas


9

A importação mostra a mensagem de erro "Os nomes das colunas têm duplicatas", mas não tenho duplicatas.

Quem posso consertar isso?

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

⇬ Fazer download do arquivo

Verifiquei se todos os meus campos também existem no CSV exportado. Estou faltando algumas linhas necessárias? Eu tentei verificar, mas esta página wiki de 2012 requer colunas que não estão no arquivo exportado. Portanto, não tenho certeza de quais são os volumes necessários.

A versão do PHP é 5.2.17


Faça uma exportação e compare se você tem o mesmo conjunto de colunas.
user487772

Bem, eu não tenho, mas tenho as colunas necessárias, então o que estou perdendo aqui?
PiTheNumber

Que tipo de importação você está usando?
user487772

O /admin/import, não o fluxo de dados antigo.
PiTheNumber

Então a maioria das colunas que você exemplo, têm títulos errados
user487772

Respostas:


13

A exceção com a mensagem de erro que você especificou é acionada em exatamente um local (código ligeiramente truncado para facilitar a leitura):

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

Isso significa que count(array_unique($this->_colNames))deve ser desigual para$this->_colQuantity

A $_colNamesmatriz é configurada Mage_ImportExport_Model_Import_Adapter_Csv::rewind()(que é chamada durante _init().
Mais uma vez, o código é ligeiramente truncado para facilitar a leitura:

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

O $_delimiterestá definido como ,, o $_enclosureestá definido como ".

Para tentar reproduzir o problema, se eu copiar o extrato CSV da sua pergunta para um arquivo chamado test.csv e executar o seguinte 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);

produz a seguinte saída:

29 records, 29 unique records

Isso significa que seu arquivo CSV está fundamentalmente correto. A diferença deve estar em outro lugar.
Observando como array_uniquefunciona, há uma observação de como o tipo de manipulação dos elementos do array mudou no PHP 5.2.9: http://php.net/manual/en/function.array-unique.php#refsect1-function.array-unique -changelog

Para reproduzir o problema, executei novamente meu script de teste com o SORT_REGULARconjunto de opções, mas isso ainda dá o mesmo resultado (o que é lógico, pois a leitura de um arquivo pode fornecer apenas valores de sequência de caracteres).

No momento, acredito que a diferença deve estar no arquivo CSV que você está usando. Os caracteres de nova linha do Unix e do Windows ( \ne \r\n) são reconhecidos pelo fgetcsv()comando, mas o antigo caractere de nova linha do estilo MacOS ( \r) levaria realmente ao comportamento que você está enfrentando.

Não sei se esse é o motivo pelo qual você está enfrentando o problema, mas sugiro que verifique o arquivo CSV (novamente). Também pode ajudar se você fornecer um link de download em algum lugar para o arquivo não modificado (sem pastebin), para que todos os caracteres não imprimíveis sejam preservados.

Também pode ajudar se você postar a versão PHP que está usando.


11
É isso aí! Eu usei o webhex.net e o arquivo tem quebras de linha 0D MaxOS \ r. Mudei para \ r \ n e agora funciona. Muito obrigado!
PiTheNumber

2
Você também pode tentar ativar o auto_detect_line_endings: ini_set ("auto_detect_line_endings", "1"), recomendado pelo PHP: php.net/manual/en/function.fgetcsv.php
Enrique

1

Eu estava recebendo esse erro ao editar e salvar usando o LibreOffice no meu Mac. O problema foi resolvido editando o arquivo usando o Google Drive e o erro desapareceu.

Suponho que seja devido às terminações de linha do Mac.


1

Se você verificou a codificação de nova linha e ainda tem problemas, verifique novamente se realmente não possui um nome de coluna duplicado no seu CSV. No Excel, você pode destacar rapidamente duplicatas com esta técnica:

  1. Selecione o intervalo de células que você deseja testar (neste caso, todas as células na linha do cabeçalho).
  2. Na guia Página Inicial do Excel, escolha Formatação Condicional, Destaque Regras de Células e Duplicar Valores.
  3. Clique em OK na caixa de diálogo Valores duplicados para identificar os valores duplicados.
  4. Os valores duplicados na lista agora serão identificados.

No meu caso, eu arrastei uma fórmula (não intencionalmente) para a linha do cabeçalho e baguncei meu cabeçalho.


0

Você também pode salvar o arquivo .csv (usando um Mac) como um arquivo .csv formatado no Windows. Isso corrigirá a mensagem de erro das colunas duplicadas. Eu trabalho em um Mac e é assim que eu contornar esses erros de importação. Espero que funcione para você.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.