Belirttiğiniz hata mesajının istisnası tam olarak bir yerde tetiklenir (kod okunabilirlik için biraz kesilir):
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'));
}
}
}
Bu araçlar, count(array_unique($this->_colNames))
eşit olmayan olmalıdır$this->_colQuantity
$_colNames
Dizi ayarlanır Mage_ImportExport_Model_Import_Adapter_Csv::rewind()
sırasında denir ( _init()
.
Bir kez daha, kod biraz okunabilirlik için konur:
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
Ayarlandığında ,
, $_enclosure
ayarlandığında "
.
Sorunu yeniden oluşturmayı denemek için, sorunuzdan CSV ayıklamasını test.csv adlı bir dosyaya kopyalar ve aşağıdaki kodu çalıştırırsam:
$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);
aşağıdaki çıktıyı üretir:
29 records, 29 unique records
Bu, CSV dosyanızın temelde uygun olduğu anlamına gelir. Aradaki fark başka bir yerde olmalı.
Nasıl array_unique
çalıştığına bakıldığında, PHP 5.2.9'da dizi öğelerinin tür işlemesinin nasıl değiştiğine dair bir not vardır: http://php.net/manual/en/function.array-unique.php#refsect1-function.array-unique -changelog
Sorunu yeniden oluşturmak için, test komut dosyamı SORT_REGULAR
seçenek kümesi ile yeniden çalıştırdım , ancak bu yine de aynı sonucu veriyor (bu mantıklı, çünkü bir dosyayı okumak yalnızca dize değerleri verebilir).
Şu anda farkın kullandığınız CSV dosyasında olması gerektiğine inanıyorum. Unix ve Windows yeni satır karakterlerinin ( \n
ve \r\n
) ikisi de fgetcsv()
komut tarafından tanınır , ancak eski MacOS stili yeni satır karakteri ( \r
) aslında yaşadığınız davranışa yol açar.
Sorunu yaşamanızın sebebinin bu olup olmadığını bilmiyorum, ancak CSV dosyasını kontrol etmenizi öneririm (tekrar). Değiştirilmemiş dosyaya bir indirme bağlantısı sağlarsanız (macun yok), yazdırılamayan karakterler korunur.
Kullandığınız PHP sürümünü yüklerseniz de yardımcı olabilir.