Pengecualian dengan pesan kesalahan yang Anda nyatakan dipicu tepat di satu tempat (kode sedikit terpotong untuk dibaca):
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'));
}
}
}
Ini berarti, count(array_unique($this->_colNames))
harus tidak sama dengan$this->_colQuantity
The $_colNames
Array diatur dalam Mage_ImportExport_Model_Import_Adapter_Csv::rewind()
(yang disebut selama _init()
.
Sekali lagi, kode ini sedikit dipotong untuk dibaca:
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);
}
The $_delimiter
diatur untuk ,
, yang $_enclosure
diatur untuk "
.
Untuk mencoba mereproduksi masalah, jika saya menyalin ekstrak CSV dari pertanyaan Anda ke file bernama test.csv dan jalankan kode berikut:
$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);
ini menghasilkan output sebagai berikut:
29 records, 29 unique records
Ini berarti, file CSV Anda pada dasarnya baik-baik saja. Perbedaannya harus di tempat lain.
Melihat cara array_unique
kerjanya, ada catatan bagaimana penanganan elemen array berubah di PHP 5.2.9: http://php.net/manual/en/function.array-unique.php#refsect1-function.array-unique -changelog
Untuk mereproduksi masalah, saya menjalankan ulang skrip uji saya dengan SORT_REGULAR
set opsi, tetapi ini masih memberikan hasil yang sama (yang logis, karena membaca file hanya dapat memberikan nilai string).
Saat ini saya percaya perbedaannya harus pada file CSV yang Anda gunakan. Unix dan karakter baris baru Windows ( \n
dan \r\n
) keduanya dikenali oleh fgetcsv()
perintah, tetapi karakter baris baru gaya MacOS ( \r
) sebenarnya akan mengarah pada perilaku yang Anda alami.
Saya tidak tahu apakah itu alasan Anda mengalami masalah, tetapi saya sarankan Anda memeriksa file CSV (lagi). Mungkin juga membantu jika Anda memberikan tautan unduhan di suatu tempat ke file yang tidak dimodifikasi (tidak ada pastebin), sehingga setiap karakter yang tidak dapat dicetak dipertahankan.
Mungkin juga membantu jika Anda memposting versi PHP yang Anda gunakan.