1

次のコードは、4つのフィールドをCSVに出力することになっていますCategory, SKU, Price and Special Price。出力には、このようにすべての項目の前後に3つの引用符がありますが、ほとんどの場合はうまく機能します。

"""Joystick Head""","""Man222""","""155""","""124.95"""

それでもブラウザの出力は問題ありません

Type: "Joystick Head" SKU: "Man222" Price: "155" Special Price: "124.95"

私は試しましstr_replaceたが、implode他に考えられることは何でも、さまざまな結果で、ほとんどすべての引用符を削除することができました。

私はこれがばかげていることを望んでいて、私はそれをあまりにも長い間見つめていました、助けてください?

define('SAVE_FEED_LOCATION','var/export/prices.csv');
set_time_limit(0);
require_once 'app/Mage.php';
Mage::app('default');

try{
    $handle = fopen(SAVE_FEED_LOCATION, 'w'); 

    $attributeName = 'producttype';

    $products = Mage::getModel('catalog/product')->getCollection();
    $products->addAttributeToFilter('status', 1);
    $products->addAttributeToFilter('visibility', 4);
    $products->addAttributeToSelect('*');
    $prodIds = $products->getAllIds();

    $product = Mage::getModel('catalog/product');

    $counter_test = 0;

    foreach($prodIds as $productId) {

        if (++$counter_test > 0 && $counter_test < 100){

            $product->load($productId);
            $product_data = array();    
            $productId = $product->getId();

            $productAtt = Mage::getModel('catalog/product')->load($productId);
            $attributes = $productAtt->getAttributes();

            $attributeValue = null;     
            if(array_key_exists($attributeName , $attributes)){
                $attributesobj = $attributes["{$attributeName}"];
                $attributeValue = $attributesobj->getFrontend()->getValue($productAtt);
            }
            if ($attributeValue == "No")
            {
                $attributeValue = NULL;
            }

            $product_data['producttype'] = $attributeValue;
            $product_data['sku'] = $product->getSku();  
            $product_data['price'] = round($product->getPrice(),2);
            $product_data['special_price'] = round($product->getSpecialprice(),2);  

            // if no special price use normal price
            if ($product_data['special_price'] == NULL) { 
                $product_data['special_price'] = round($product->getPrice(),2);
            }

            foreach($product_data as $k=>$val){
                $bad=array('"',"\r\n","\n","\r","\t");
                $good=array(""," "," "," ","");
                $product_data[$k] = '"'.str_replace($bad,$good,$val).'"'; 
            }

            echo "Type: ". $product_data['producttype'] . " SKU: " . $product_data['sku'] . " Price: ". $product_data['price'] . " Special Price: " . $product_data['special_price'] . "<br>";

            fputcsv($handle, $product_data, ',', '"');
        }
    }
    fclose($handle);
    echo '<br> Completed at: ' . time();
}
catch(Exception $e){
    $headers = 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; 
    error_log($e->getMessage(), 1, 'myemail@mydomain.com', $headers);
    die($e->getMessage());
}
4

1 に答える 1

0

問題は一列に並んでいます

$product_data[$k] = '"'.str_replace($bad,$good,$val).'"';

そこで、コードは配列の各値に二重引用符を追加します。後で、fputcsv()引用符を3倍にして、CVS形式でデータを適切に出力することで引用符をエスケープします。PHPドキュメントのfputcsv()例を見て、これが正常な動作であることを確認できます。

3x二重引用符は、CSVトランスポートを介して別のシステムに値を渡している間、元のデータの二重引用符を保持するための単なる方法であるため、問題はありません。ただし、意図的に二重引用符を削除すると、その行はタイプミスのように見えます。次のようになります。

$product_data[$k] = str_replace($bad, $good, $val);



その他の注意事項

  1. 値から二重引用符を取り除く必要はありません。CSVの悪いシンボルではありません。悪い記号から二重引用符を削除し、三重二重引用符をまったく気にしないことをお勧めします。
  2. str_replace()、配列を3番目の引数として取ることができます。foreachしたがって、サイクルで行うのではなく、1回の呼び出しですべての不正な値を置き換えることができます。例えば:$product_data = str_replace($bad, $good, $product_data);
  3. サイクルの反復ごとに、悪い値と良い値の配列を再宣言する必要はありません。foreach ($prodIds as $productId) {スクリプトでは変更されないため、宣言を行の直前に移動できます
于 2013-01-16T07:51:14.147 に答える