0

xmlファイルから指定した値だけをcsvに変換したい...

XML ファイル:

<?xml version="1.0" encoding="UTF-8"?>
<file>
<PRODUCT sku="12345" price="129"/>
<PRODUCT sku="12356" price="150"/>
<PRODUCT sku="12367" price="160"/>
<PRODUCT sku="12389" price="190"/>
</file>

CSV ファイル。

SKU、価格
12345,129
12356,150
12367,160
12389,190

12345、12367、12389のみの価格を知りたい

これは私の開始ファイルです:

 <?php
    $filexml = 'file.xml';
        if (file_exists($filexml)){
            $xml = simplexml_load_file($filexml);
            $file = fopen('file.csv', 'w');
            $header = array('sku', 'price');
            fputcsv($file, $header, ',', '"');
            foreach ($xml->PRODUCT as $product){
                $item = array();
                $value1 = $product->attributes()->sku;
                $value2 = $product->attributes()->price;

            $item[] = $value1;
        $item[] = $value2;
                fputcsv($file, $item, ',', '"');    
            }
            fclose($file);
        }

    ?>

オプションはこれにすることができますが、私に配列を返しています。おそらくそこに何か問題があります。

<?php
        $filexml = 'file.xml';
            if (file_exists($filexml)){
                $xml = simplexml_load_file($filexml);
                $file = fopen('file.csv', 'w');
                $header = array('sku', 'price');
                $customvalue = array('12345', '12367', '12389');
                fputcsv($file, $header, ',', '"');
                foreach ($xml->PRODUCT as $product){
                    $item = array();
                    $value1 = $product->attributes()->sku;
                    $value2 = $product->attributes()->price;

                $item[] = $customvalue;
                $item[] = $value2;
                    fputcsv($file, $item, ',', '"');    
                }
                fclose($file);
            }

        ?>

ありがとう

ライアンの解決策:

<?php
            $filexml = 'file.xml';
                if (file_exists($filexml)){
                $xml = simplexml_load_file($filexml);
                $file = fopen('file.csv', 'w');
                $header = array('sku', 'price');
                    $customvalue = array('12345', '12367', '12389');
                fputcsv($file, $header, ',', '"');
                foreach ($xml->PRODUCT as $product){        
                    if ( in_array($product->attributes()->sku, $customvalue ) ) {
                    $item = array ();
                    $item[] = $product->attributes()->sku;
                    $item[] = $product->attributes()->price;
                    fputcsv($file, $item, ',', '"');    
                    }
                fclose($file);
                }
            ?>

しかし、出力は真実で良好ですが、約7000コードの大きなファイルでは300MBのcsvファイルになるため、不要なコードを削除する必要があります。

これが出力です。

12345,129
12345,129,12356,150
12367,160
12389,190 

大きなファイルでは、これを取得しています:

12345,129
12345,129,123456,150,12367,160
12389,190,123456,150,12367,160,12345,129
12399,200
12399,200,12345,129,12389,160,123456,150
12399,200,12345,129,12389,160,123456,150,12399,200,12345,129,12389,160,123456,150

配列で指定されたコードは最初に右側の列にありますが、最後にこれは大きな csv ファイルを作成しています。結果のタイムアウトまたはメモリ不足。

ありがとう

4

1 に答える 1

0

あなたは正しい軌道に乗っています。指定された行のみを読み取るようにチェックを追加し、次のように、必要なフィールドの引き出しを簡素化します (foreachループのみ、残りは同じままです:

    foreach ($xml->PRODUCT as $product){        
    if ( in_array($product->attributes()->sku, $customvalue ) ) {
          $item = array ();
      $item[] = $product->attributes()->sku;
      $item[] = $product->attributes()->price;
      fputcsv($file, $item, ',', '"');    
    }
于 2012-10-08T12:06:20.127 に答える