导入:列名重复


9

导入显示错误消息“列名重复”,但我没有重复。

谁可以解决这个问题?

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

下载文件

我确保所有字段也都存在于导出的csv中。我是否缺少一些必需的行?我尝试检查,但从2012年起,此Wiki页面需要的列甚至不在导出的文件中。因此,我不确定需要哪些列。

PHP版本是5.2.17


导出并比较您是否具有相同的列集。
user487772 2013年

好吧,我没有,但是我有必要的列,所以我在这里错过了什么?
PiTheNumber

您正在使用哪种类型的导入?
user487772 2013年

/admin/import,不老的数据流。
PiTheNumber

然后,您示例中的大多数列标题都有错误
user487772 2013年

Answers:


13

您声明的错误消息的异常仅在一个位置触发(出于可读性考虑,代码略有缩短):

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

这意味着,count(array_unique($this->_colNames))必须等于$this->_colQuantity

$_colNames数组设置为Mage_ImportExport_Model_Import_Adapter_Csv::rewind()(在期间调用_init()
再次,出于可读性考虑,代码被略微截断了:

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

$_delimiter设置为,,将$_enclosure设置为"

为了重现该问题,如果我将您问题中的CSV摘录复制到一个名为test.csv的文件中,然后运行以下代码:

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

它产生以下输出:

29 records, 29 unique records

这意味着您的CSV文件从根本上来说还可以。区别必须在其他地方。
查看array_unique工作原理,请注意在PHP 5.2.9中如何更改数组元素的类型处理:http : //php.net/manual/en/function.array-unique.php#refsect1-function.array-unique -变更日志

为了重现该问题,我使用SORT_REGULAR选项集重新运行了测试脚本,但这仍然给出相同的结果(这是合乎逻辑的,因为读取文件只能提供字符串值)。

目前,我相信差异必须在您使用的CSV文件中。该命令可以识别Unix和Windows的换行符(\n\r\nfgetcsv(),但是旧的MacOS风格的换行符(\r)实际上会导致您遇到的行为。

我不知道这是否是您遇到此问题的原因,但是我建议您再次检查CSV文件。如果您在未修改的文件的某个地方提供了下载链接(没有pastebin),那么它也可能会有所帮助,这样会保留所有不可打印的字符。

如果发布所用的PHP版本,也可能会有帮助。


1
而已!我使用了webhex.net,结果该文件具有0D MaxOS换行符\ r。我将其更改为\ r \ n,现在可以使用了。非常感谢!
PiTheNumber

2
您也可以尝试启用auto_detect_line_endings:ini_set(“ auto_detect_line_endings”,“ 1”),PHP建议:php.net/manual/en/function.fgetcsv.php
Enrique

1

在Mac上使用LibreOffice编辑和保存时,我收到此错误。通过改用Google云端硬盘编辑文件解决了问题,然后错误消失了。

我认为这是由于Mac行尾。


1

如果您检查了换行编码仍然存在问题,请再次检查您的CSV中实际上没有重复的列名。在Excel中,您可以使用此技术快速突出显示重复项:

  1. 选择您要测试的单元格范围(在这种情况下,标题行中的所有单元格)。
  2. 在Excel的“主页”选项卡上,选择“条件格式”,“突出显示单元格规则”,然后选择“重复值”。
  3. 在“重复值”对话框中单击“确定”以标识重复值。
  4. 现在将识别列表中的重复值。

在我的情况下,我(无意间)将一个公式拖到标题行中,弄乱了标题。


0

您也可以将.csv文件(使用Mac)保存为Windows格式的.csv。这将修复重复的列错误消息。我在Mac上工作,这就是解决这些导入错误的方法。希望对你有效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.