Ngoại lệ với thông báo lỗi bạn đã nêu được kích hoạt ở chính xác một nơi (mã bị cắt ngắn để dễ đọc):
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'));
}
}
}
Điều này có nghĩa, count(array_unique($this->_colNames))
phải không bằng$this->_colQuantity
Các $_colNames
mảng được đặt trong Mage_ImportExport_Model_Import_Adapter_Csv::rewind()
(được gọi là trong suốt _init()
.
Một lần nữa, các mã được hơi cắt ngắn để có thể đọc:
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);
}
Cái $_delimiter
được đặt thành ,
, cái $_enclosure
được đặt thành "
.
Để thử tái tạo vấn đề, nếu tôi sao chép trích xuất CSV từ câu hỏi của bạn vào một tệp có tên test.csv và chạy mã sau đây:
$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);
nó tạo ra đầu ra sau:
29 records, 29 unique records
Điều này có nghĩa, về cơ bản, tệp CSV của bạn ổn. Sự khác biệt phải ở một nơi khác.
Nhìn vào cách thức array_unique
hoạt động, có một lưu ý về cách xử lý kiểu của các phần tử mảng đã thay đổi trong PHP 5.2.9: http://php.net/manual/en/feft.array-unique.php#refsect1-feft.array-unique -chuyển đổi
Để tái tạo vấn đề, tôi chạy lại tập lệnh thử nghiệm của mình với tập SORT_REGULAR
tùy chọn, nhưng điều này vẫn cho kết quả tương tự (điều này hợp lý, vì đọc một tệp chỉ có thể đưa ra các giá trị chuỗi).
Tại thời điểm này, tôi tin rằng sự khác biệt phải có trong tệp CSV bạn đang sử dụng. Các ký tự dòng mới Unix và Windows ( \n
và \r\n
) đều được fgetcsv()
lệnh nhận ra , nhưng ký tự dòng mới kiểu MacOS ( \r
) thực sự sẽ dẫn đến hành vi bạn đang gặp phải.
Tôi không thể biết đó có phải là lý do tại sao bạn gặp phải sự cố không, nhưng tôi khuyên bạn nên kiểm tra tệp CSV (một lần nữa). Nó cũng có thể hữu ích nếu bạn cung cấp một liên kết tải xuống ở đâu đó vào tệp chưa sửa đổi (không có pastebin), vì vậy mọi ký tự không in được đều được giữ nguyên.
Nó cũng có thể hữu ích nếu bạn đăng phiên bản PHP bạn đang sử dụng.