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 回答