1

例:csv2つの列があります。構造は次のとおりです。ヘッダーのみがあります。

sku name

ここで、foreachループがあります。

foreach ($collection as $product_all) 
{
    $sku = $product_all['sku'];
    $product_id = Mage::getModel('catalog/product')->getIdBySku($sku);
    $product    = Mage::getModel('catalog/product');
    $product ->load($product_id);
    $name = $product['name'];
}

8000行の行がある場合は、$skuとをcsvファイルに入れたいと思います。$name私はどのように行いますか?次のコードを使用しています。しかし、それは機能しません。それを修正する方法は?ありがとうございました。

foreach ($collection as $product_all) 
{
    $sku = $product_all['sku'];
    $product_id = Mage::getModel('catalog/product')->getIdBySku($sku);
    $product    = Mage::getModel('catalog/product');
    $product ->load($product_id);   
    $name = $product['name'];
    $newCsvData = array();
    if (($handle = fopen("test.csv", "r")) !== FALSE) 
    {
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
        {
            $data[0] = $sku;
            $data[2] = $name;
            $newCsvData[] = $data;
        }
        fclose($handle);
    }

    $handle = fopen('test.csv', 'w');
    foreach ($newCsvData as $line) 
    {
        fputcsv($handle, $line);
    }

    fclose($handle);
}
4

4 に答える 4

2

試しませんでしたが、動作するはずです。

$csvData = array();
foreach ($collection as $product_all) {
  $sku = $product_all['sku'];
  $product_id = Mage::getModel('catalog/product')->getIdBySku($sku);
  $product    = Mage::getModel('catalog/product');
  $product ->load($product_id);   
  $name = $product['name'];

  $csvData[] = array($sku, $name);
}


$handle = fopen('test.csv', 'w');
fputcsv($handle, array('sku', 'name'));
foreach($csvData as $row) {
  fputcsv($handle, $row);
}
fclose($handle);

このfputcsv関数は、すべてのエスケープを処理します。これは、csvファイルを任意の入力で機能させたい場合は簡単な作業ではありません。

fputcsv他の回答に関するコメントを読んだ後、呼び出しをループ内に移動できます。

$handle = fopen('test.csv', 'w');
fputcsv($handle, array('sku', 'name'));

foreach ($collection as $product_all) {
  $sku = $product_all['sku'];
  $product_id = Mage::getModel('catalog/product')->getIdBySku($sku);
  $product    = Mage::getModel('catalog/product');
  $product ->load($product_id);   
  $name = $product['name'];

  fputcsv($handle, array($sku, $name));
}

fclose($handle);
于 2013-01-11T14:49:30.513 に答える
1

私が考えることができる最も簡単な解決策:

// The filename to write to
$csvFile = 'theCSVfile.csv';
$csvRows = array();

foreach ($collection as $product_all) {
  $sku = $product_all['sku'];
  $product_id = Mage::getModel('catalog/product')->getIdBySku($sku);
  $product    = Mage::getModel('catalog/product');
  $product ->load($product_id);
  // Replacing quotation marks with CSV escaped ones
  $name = str_replace( '"' , '""' , $product['name'] );

  $csvRows[] = "{$sku},\"{$name}\"";
}

file_put_contents( $csvFile , implode( "\n" , $csvRows ) );

$name変数にコンマやその他の異常な文字が含まれている場合、無効なCSV構文が生成される可能性があることに注意してください。

Bogdanが指摘しているように、ファイルへの1回の書き込みを実行する前に、RAM内のすべての行を保持する必要があるため、これはメモリを大量に消費する可能性があります。それが懸念される場合、または非常に多数の行を処理している場合は、次のコードで書き込みを小さなチャンクにバッチ処理します。

// The filename to write to
$csvFile = 'theCSVfile.csv';
// Rows per chunk
$csvChunk = 1000;

// Initialise the Array
$csvRows = array();
// Variable to check if first write performed
$firstWriteDone = false;

function writeChunk(){
  global $csvFile, $csvRows, $csvChunk, $firstWriteDone;

  if( count( $csvRows )==$csvChunk ){
    // Chunk Limit Reached - Write to disk
    file_put_contents(
      $csvFile ,
      ( !$firstWriteDone ? "\n" : '' ) . implode( "\n" , $csvRows ) ,
      ( !$firstWriteDone ? FILE_APPEND : 0 )
    );
    // Set the First Write Done flag
    $firstWriteDone = true;
    // Reset the Array
    $csvRows = array();
  }
}

foreach ($collection as $product_all) {
  $sku = $product_all['sku'];
  $product_id = Mage::getModel('catalog/product')->getIdBySku($sku);
  $product    = Mage::getModel('catalog/product');
  $product ->load($product_id);
  // Replacing quotation marks with CSV escaped ones
  $name = str_replace( '"' , '""' , $product['name'] );

  $csvRows[] = "{$sku},\"{$name}\"";

  if( count( $csvRows )==$csvChunk ){
    // Chunk Limit Reached - Write to disk
    writeChunk();
  }
}
if( count( $csvRows ) ){
  // Write the Last Chunk, even if not at the limit
  writeChunk();
}
于 2013-01-11T14:42:09.830 に答える
0

あなたのコードはめちゃくちゃです...各DBエントリについて..あなたはcsvを読みます..それから日付を収集し(なし?)そしてそれをcsvに「書き込み」ます..

コードを修正する:

    $newCsvData = array();

    foreach ($collection as $product_all) { 
        $sku = $product_all['sku'];

        $product_id = Mage::getModel('catalog/product')->getIdBySku($sku);

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

        $product->load($product_id);

        $name = $product['name'];

        //move BEFORE the foreach
        /*$newCsvData = array();*/

        //remove this ...
        /*if (($handle = fopen("test.csv", "r")) !== FALSE) {
            while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
                $data[0] = $sku;
                $data[2] = $name;
                $newCsvData[] = $data;
            }
            fclose($handle);
        }*/

        //move AFTER the foreach
        /*
        $handle = fopen('test.csv', 'w');

        foreach ($newCsvData as $line) {
            fputcsv($handle, $line);
        }

        fclose($handle);*/
    }

    $handle = fopen('test.csv', 'w');

    foreach ($newCsvData as $line) {
        fputcsv($handle, $line);
    }

    fclose($handle);

他の例を確認してください。おそらく、コードの何が問題になっているのかを指摘したいだけです。

于 2013-01-11T14:58:31.223 に答える
0

製品コレクションを反復処理するときに、行をファイルに書き込みます。

$fh = fopen('test.csv', 'w');

foreach ($collection as $product_all) {
    $sku = $product_all['sku'];
    $product_id = Mage::getModel('catalog/product')->getIdBySku($sku);
    $product    = Mage::getModel('catalog/product');
    $product ->load($product_id);   
    $name = $product['name'];

    fwrite($fh, "{$sku},{$name}\n");
}

fclose($fh);
于 2013-01-11T15:01:01.787 に答える