นำเข้า: ชื่อคอลัมน์มีรายการที่ซ้ำกัน


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 ต้องใช้ columens ที่ไม่ได้อยู่ในไฟล์ที่ส่งออก ดังนั้นฉันไม่แน่ใจว่าโคลูเมนจำเป็นต้องมีอะไรบ้าง

เวอร์ชัน PHP คือ 5.2.17


ทำการส่งออกและเปรียบเทียบว่าคุณมีชุดคอลัมน์เดียวกัน
user487772

ฉันทำไม่ได้ แต่ฉันมีคอลัมน์ที่จำเป็นดังนั้นฉันจะพลาดอะไรที่นี่?
PiTheNumber

คุณกำลังนำเข้าประเภทใด
user487772

ที่/admin/importไม่ใช่ dataflow เก่า
PiTheNumber

จากนั้นคอลัมน์ในตัวอย่างส่วนใหญ่ของคุณมีชื่อที่ไม่ถูกต้อง
487772

คำตอบ:


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 -changelog

ในการทำให้เกิดปัญหาอีกครั้งฉันรันสคริปต์ทดสอบอีกครั้งพร้อมSORT_REGULARชุดตัวเลือก แต่สิ่งนี้ยังให้ผลลัพธ์เหมือนเดิม (ซึ่งเป็นตรรกะเนื่องจากการอ่านไฟล์สามารถให้ค่าสตริงได้เท่านั้น)

ในเวลานี้ฉันเชื่อว่าความแตกต่างจะต้องอยู่ในไฟล์ CSV ที่คุณใช้งานอยู่ อักขระบรรทัดใหม่ของ Unix และ Windows ( \nและ\r\n) ทั้งคู่เป็นที่รู้จักโดยfgetcsv()คำสั่ง แต่อักขระบรรทัดใหม่สไตล์ 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

ฉันได้รับข้อผิดพลาดนี้เมื่อแก้ไขและบันทึกโดยใช้ LibreOffice บน Mac ของฉัน ปัญหาได้รับการแก้ไขโดยแก้ไขไฟล์โดยใช้ Google ไดรฟ์แทนจากนั้นข้อผิดพลาดก็หายไป

ฉันถือว่ามันเป็นเพราะตอนจบของสาย Mac


1

หากคุณตรวจสอบการเข้ารหัสบรรทัดใหม่และยังคงมีปัญหาอยู่ให้ตรวจสอบอีกครั้งว่าคุณไม่มีชื่อคอลัมน์ซ้ำกันใน CSV ของคุณ ใน Excel คุณสามารถเน้นรายการที่ซ้ำกันได้อย่างรวดเร็วด้วยเทคนิคนี้:

  1. เลือกช่วงของเซลล์ที่คุณต้องการทดสอบ (ในกรณีนี้เซลล์ทั้งหมดในแถวส่วนหัว)
  2. บนแท็บหน้าแรกของ Excel ให้เลือกการจัดรูปแบบตามเงื่อนไขเน้นกฎของเซลล์แล้วทำซ้ำค่า
  3. คลิกตกลงภายในกล่องโต้ตอบค่าซ้ำเพื่อระบุค่าที่ซ้ำกัน
  4. ค่าที่ซ้ำกันในรายการจะถูกระบุในขณะนี้

ในกรณีของฉันฉันลากสูตร (โดยไม่ได้ตั้งใจ) ลงในแถวส่วนหัวและทำให้ส่วนหัวของฉันสับสน


0

คุณยังสามารถบันทึกไฟล์. csv (โดยใช้ Mac) เป็นไฟล์. csv ในรูปแบบ Windows สิ่งนี้จะแก้ไขข้อความแสดงข้อผิดพลาดคอลัมน์ที่ซ้ำกัน ฉันทำงานบน Mac และนี่คือวิธีที่ฉันได้รับข้อผิดพลาดในการนำเข้าเหล่านี้ หวังว่ามันจะเหมาะกับคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.