インポート:列名が重複しています


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年のWikiページには、エクスポートされたファイルにもない列が必要です。したがって、必要な列は何なのかわかりません。

PHPバージョンは5.2.17です


エクスポートを実行して、同じ列セットがあることを比較します。
user487772 2013年

まあ、私はしませんが、必要な列ありますので、ここで何が欠けていますか?
PiTheNumber

どのタイプのインポートを使用していますか?
user487772

/admin/import、ない古いデータフロー。
PiTheNumber

次に、例のほとんどの列のタイトルが間違っています
user487772

回答:


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ファイルを(もう一度)確認することをお勧めします。また、変更されていないファイル(ペーストビンなし)へのダウンロードリンクを提供すると、印刷できない文字が保持されるので役立ちます。

また、使用しているPHPバージョンを投稿すると役立つ場合があります。


1
それでおしまい!私はwebhex.netを使用しましたが、ファイルに0D MaxOS改行があることが判明しました\ r。私はそれを\ r \ nに変更しましたが、動作します。どうもありがとう!
PiTheNumber 2013年

2
auto_detect_line_endings:ini_set( "auto_detect_line_endings"、 "1")を有効にしてみることもできます。これはPHPで推奨されています:php.net/manual/en/function.fgetcsv.php
Enrique

1

MacでLibreOfficeを使用して編集および保存すると、このエラーが発生しました。代わりにGoogleドライブを使用してファイルを編集することで問題が解決し、エラーは解消しました。

Macの行末によるものだと思います。


1

改行エンコーディングを確認しても問題が解決しない場合は、CSVに実際に重複した列名がないことを再確認してください。Excelでは、この手法で重複をすばやくハイライトできます。

  1. テストするセルの範囲を選択します(この場合、ヘッダー行のすべてのセル)。
  2. Excelの[ホーム]タブで、[条件付き書式]、[セルのルールの強調表示]、[値の複製]の順に選択します。
  3. [重複する値]ダイアログボックス内で[OK]をクリックして、重複する値を識別します。
  4. リスト内の重複する値が識別されます。

私の場合、式を(意図せずに)ヘッダー行にドラッグし、ヘッダーをめちゃくちゃにしました。


0

(Macを使用して).csvファイルをWindows形式の.csvとして保存することもできます。これにより、列の重複エラーメッセージが修正されます。私はMacで作業していますが、これがこれらのインポートエラーを回避する方法です。それがあなたのために働くことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.