Impor: Nama kolom memiliki duplikat

9

Impor menunjukkan pesan kesalahan "Nama kolom memiliki duplikat" tapi saya tidak punya duplikat.

Siapa yang bisa saya perbaiki ini?

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

Unduh berkas

Saya memastikan semua bidang saya juga ada di csv yang diekspor. Apakah saya melewatkan beberapa baris yang diperlukan? Saya mencoba untuk memeriksa tetapi halaman wiki ini dari 2012 memerlukan kolum yang bahkan tidak ada dalam file yang diekspor. Jadi saya tidak yakin apa saja yang dibutuhkan oleh kolumens.

Versi PHP adalah 5.2.17

PiNomor
sumber
Lakukan ekspor dan bandingkan bahwa Anda memiliki set kolom yang sama.
user487772
Yah, saya tidak melakukannya tetapi saya memiliki kolom yang diperlukan jadi apa yang saya lewatkan di sini?
PiTheNumber
Jenis impor apa yang Anda gunakan?
user487772
Itu /admin/import, bukan aliran data lama.
PiTheNumber
Maka sebagian besar kolom dalam contoh Anda memiliki judul yang salah
user487772

Jawaban:

13

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 $_colNamesArray 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 $_delimiterdiatur untuk ,, yang $_enclosurediatur 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_uniquekerjanya, 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_REGULARset 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 ( \ndan \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.

Vinai
sumber
1
Itu dia! Saya menggunakan webhex.net dan ternyata file tersebut memiliki jeda baris Maxos 0D. Saya mengubahnya ke \ r \ n dan sekarang berfungsi. Terima kasih banyak!
PiTheNumber
2
Anda juga dapat mencoba mengaktifkan auto_detect_line_endings: ini_set ("auto_detect_line_endings", "1"), disarankan oleh PHP: php.net/manual/en/function.fgetcsv.php
Enrique
1

Saya menerima kesalahan ini ketika mengedit dan menyimpan menggunakan LibreOffice di Mac saya. Masalah diselesaikan dengan mengedit file menggunakan Google Drive sebagai gantinya, kemudian kesalahan hilang.

Saya menganggap itu karena akhir baris Mac.

James Pelton
sumber
1

Jika Anda memeriksa pengodean baris baru dan masih memiliki masalah, periksa kembali apakah Anda sebenarnya tidak memiliki nama kolom duplikat di CSV Anda. Di Excel Anda dapat dengan cepat menyorot duplikat dengan teknik ini:

  1. Pilih rentang sel yang ingin Anda uji (dalam hal ini semua sel di baris tajuk).
  2. Pada tab Beranda Excel, pilih Pemformatan Bersyarat, Aturan Sel Sorotan, dan kemudian Nilai Gandakan.
  3. Klik OK di dalam kotak dialog Duplicate Values ​​untuk mengidentifikasi nilai duplikat.
  4. Nilai duplikat dalam daftar sekarang akan diidentifikasi.

Dalam kasus saya, saya telah menyeret formula (tanpa sengaja) ke baris header dan mengacaukan header saya.

Komandan Kode
sumber
0

Anda juga dapat menyimpan file .csv (menggunakan Mac) sebagai .csv yang diformat Windows. Ini akan memperbaiki pesan kesalahan kolom duplikat. Saya bekerja pada Mac dan ini adalah bagaimana saya mengatasi kesalahan impor ini. Semoga ini berhasil untuk Anda.

Christopher Clarke
sumber