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_replaceimplode以及我能想到的任何其他方法,结果各不相同,有时设法删除了几乎所有的引号。

我希望这是愚蠢的,我已经盯着它太久了,帮助?

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()转义引号将它们加倍以正确输出 CVS 格式的数据。您可以查看PHP 文档fputcsv()中的示例以了解这是正常行为。

3x 双引号没有任何问题,因为它只是一种在原始数据中保留双引号的方法,同时通过 CSV 传输将值传递给另一个系统。但是,如果您故意去掉双引号,那么该行看起来像是有错字。预计为:

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



补充说明

  1. 您不需要从值中去除双引号。对于 CSV 来说,这不是一个坏符号。我建议从不良符号中删除双引号,并且根本不介意三重双引号。
  2. str_replace()可以将数组作为第三个参数。因此,您可以在一次调用中替换所有错误值,而不是foreach循环执行。例如:$product_data = str_replace($bad, $good, $product_data);
  3. 您不需要在每次循环迭代时重新声明坏值数组和好值数组。它们在脚本中没有改变,所以它们的声明可以foreach ($prodIds as $productId) {在行之前移动
于 2013-01-16T07:51:14.147 回答