Переводим YML в CSV

17.11.2015
Данный скрипт парсит YML (или аналогичный XML файл) и сохраняет данные в CSV.

index.php (Download)

 <?
  ini_set('display_errors', '1');
  error_reporting(2047);

  require_once('parser.php');

  $oParser = new c_yml_parser();
  $oParser->Parse('Input/vm2_market.xml', 'Output/file.csv');
//  $oParser->Parse('vm2_market_1251.xml');

?>

parser.php (Download)

 <?
  class c_yml_parser
  {
    /**
     * Main
     *
     * @param string $sFN_in  - что парсть
     * @param string $sFN_out - куда записывать результат (в его подпапку images складывать картинки)
     *
     * @return void
     */
    public function Parse($sFN_in, $sFN_out)
    {
        $aImportCats = array();

/*
        32;  // Матадор
        14;  // Браво
        894; // Onika
        877; // Комплекты для ванной Aquanet

        905; // мебель для ванной Акватон
        22; // Двери Белоруссии--шпон+массив
        15; // Владимирские двери
        37; // Ульяновские двери
        42; // Ярославские  двери
*/
        $aImportCats[] = 12; // Арки


      $sPicDir = dirname($sFN_out);

      $oXml = simplexml_load_file($sFN_in);

      $aList = array();

      $aTitles = array(
        'Артикул',
//        'Наименование',
//        'Наименование (English)',
        'Наименование (Русский)',
        'ID страницы (часть URL; используется в ссылках на эту страницу)',
        'Цена',
        'Название вида налогов',
        'Скрытый',
        'Можно купить',
        'Старая цена',
        'На складе',
        'Продано',
//        'Описание',
        'Описание (Русский)',
//        'Краткое описание',
        'Краткое описание (Русский)',
        'Сортировка',
//        'Заголовок страницы',
        'Заголовок страницы (Русский)',
//        'Тэг META keywords',
//        'Тэг META description',
        'Тэг META keywords (Русский)',
        'Тэг META description (Русский)',
        'Стоимость упаковки',
        'Вес продукта',
        'Бесплатная доставка',
        'Ограничение на минимальный заказ продукта (штук)', // 20
        'Файл продукта',
        'Количество дней для скачивания',
        'Количество загрузок (раз)',
        'Фотография'
      );                                      // 24

//, Фотография
      $aList[] = $aTitles;

      echo '<b>Count:</b>'. count($oXml->shop->categories->category).'<br>';

      $aCats = array();
      foreach($oXml->shop->categories->category as $oCategory)
      {
        $aAttr = $oCategory->attributes();
        $id = $aAttr['id'];
//        echo 'id'.$id.'<br>';
//        echo '['.$id.'] '.$oCategory.'<br>';

        $aCats["$id"] = (string) $oCategory;
      }

/*
      echo '<pre>';
        print_r($aCats);
      echo '</pre><hr/>';
//*/

      $aResults = array();

      echo '<b>Count:</b>'. count($oXml->shop->offers->offer).'<br>';
      $curr_category_Id = -1;
      $i=0;
      $iGetedItemsCount=0;
      foreach($oXml->shop->offers->offer as $oOffer)
      {
/*
        echo '<pre>';
          print_r($oOffer);
        echo '</pre>';
//*/
        $oOffer = $this->UTF_2_1251($oOffer);

        $categoryId = (int) $oOffer->categoryId;


        if (in_array($categoryId, $aImportCats))
        {
          $PicName = $categoryId .'_'. $this->makePicName($oOffer->picture, $i);

          if ($curr_category_Id != $categoryId)
          {
//           echo $curr_category_Id. ' :: ' .$categoryId.'<br>';

//             $oAcrCat = isset($aCats[$categoryId])?$aCats[$categoryId]:Null;

            if (!isset($aResults[$categoryId]))
            {
              $aResults[$categoryId] = array();
            }

/*
            if ($oAcrCat)
            {
              $oAcrCat = $this->UTF_2_1251($oAcrCat);
              $aList[] = $this->makeCategory($oAcrCat, $i);
            }
            else
            {
              echo 'Error $categoryId:'.$categoryId.'<br>';
            }
*/

            $curr_category_Id = $categoryId;

//            echo '['.$categoryId.'] '.$oAcrCat.'<br>';
          }

          //$aList[] = $this->makeItem($oOffer, $i, $PicName);
          $aResults[$categoryId][] = $this->makeItem($oOffer, $i, $PicName);
          $iGetedItemsCount++;

          $sNewFileName = $sPicDir.'/images/'.$PicName;
          if (!file_exists($sNewFileName))
          {
            copy($oOffer->picture, $sNewFileName);
          }

        }

        $i++;
/*
        if ($i > 2000)
        {
          break;
        }
//*/
      }

      foreach($aResults as $categoryId => $aResult)
      {
        $oAcrCat = isset($aCats[$categoryId])?$aCats[$categoryId]:Null;
        if ($oAcrCat)
        {
          $oAcrCat = $this->UTF_2_1251($oAcrCat);
          $aList[] = $this->makeCategory($oAcrCat, $i);

          foreach($aResult as $lines) // Оптимизировать
          {
            $aList[] = $lines;
          }

        }
        else
        {
          echo 'Error $categoryId:'.$categoryId.'<br>';
        }
      }

      $fp = fopen($sFN_out, 'w');
      foreach ($aList as $fields)
      {
        fputcsv($fp, $fields, ';');
      }
      fclose($fp);


      echo 'Количество выгруженных элеметнов: '.$iGetedItemsCount.'<br>';
      echo 'memory_get_peak_usage: <b>'.$this->mem_convert(memory_get_peak_usage(True)).'</b><br>';
//-      echo 'memory_get_usage: <b>'.$this->mem_convert(memory_get_usage(True)).'</b><br>';
    }

    /**
     * Text
     *
     * @param mixed $OBJ
     * @return object
     */
    function UTF_2_1251(&$OBJ)
    {
/*
@attributes
url
price
currencyId
categoryId
picture
delivery
vendor
model
description
*/

      if (is_object($OBJ))
      {
        $class_vars = get_object_vars($OBJ);
        foreach ($class_vars as $name => $value)
        {
          if (is_string($value))
          {
            $val = '';
            try
            {
              @$val = iconv("UTF-8", "windows-1251", $value);
            }
            catch (Exception $e)
            {
              echo 'Выброшено исключение: ',  $e->getMessage(), "\n";
            }

            if ($val)
            {
              $OBJ->$name = $val;
//              echo 'ok<hr>';
            }
          }
        }
      }
      else
      {
        $OBJ = iconv("UTF-8", "windows-1251", $OBJ);
      }

      return $OBJ;
    }

/*
    function getExtension($filename)
    {
      return substr(strrchr($fileName, '.'), 1);
    }
*/

    function makePicName($fileName, $i)
    {
      if ($fileName)
      {
        $path_parts = pathinfo($fileName);
        $fileName = ($i+1).'.'.$path_parts['extension'];
        $fileName = (str_repeat('0', 12 - strlen($fileName))).$fileName;
      }

      return $fileName;
    }

    /**
     * Text
     *
     * @param object $oOffer
     * @param int $i
     * @return array
     */
    function makeItem(&$oOffer, $i, $PicName)
    {
      return array(
          $i, //'Артикул',
//          $oOffer->model, //'Наименование (English)',
          $oOffer->model, //'Наименование (Русский)',
          '', //'ID страницы (часть URL; используется в ссылках на эту страницу)',
          $oOffer->price, //'Цена',
          '', //'Название вида налогов',
          '', //'Скрытый',
          1, //'Можно купить',
          0, //'Старая цена',
          999, //'На складе',
          0, //'Продано',
          $oOffer->description, // 'Описание (Русский)',
          $oOffer->description, // 'Краткое описание (Русский)',
          $i, // 'Сортировка',
          $oOffer->model, //'Заголовок страницы (Русский)',
          $oOffer->model, //''Тэг META keywords (Русский)'
          $oOffer->model, //'Тэг META description (Русский)',
          0, //'Стоимость упаковки',
          0, //'Вес продукта',
          0, //'Бесплатная доставка',
          1, //'Ограничение на минимальный заказ продукта (штук)', // 20
          '', //'Файл продукта',
          999, //'Количество дней для скачивания',
          0, // 'Количество загрузок (раз)',
          $PicName.','.$PicName.','.$PicName //'Фотография'
        );
    }

    /**
     * Text
     *
     * @param object $oCaregory
     * @param int $i
     * @return array
     */
    function makeCategory(&$oCaregory, $i)
    {
      return array(
          '', //'Артикул',
//          $oOffer->model, //'Наименование (English)',
          $oCaregory, //'Наименование (Русский)',
          '', //'ID страницы (часть URL; используется в ссылках на эту страницу)',
          '', //'Цена',
          '', //'Название вида налогов',
          '', //'Скрытый',
          '', //'Можно купить',
          '', //'Старая цена',
          '', //'На складе',
          '', //'Продано',
          '', // 'Описание (Русский)',
          '', // 'Краткое описание (Русский)',
          $i, // 'Сортировка',
          '', //'Заголовок страницы (Русский)',
          '', //''Тэг META keywords (Русский)'
          '', //'Тэг META description (Русский)',
          '', //'Стоимость упаковки',
          '', //'Вес продукта',
          '', //'Бесплатная доставка',
          '', //'Ограничение на минимальный заказ продукта (штук)', // 20
          '', //'Файл продукта',
          '', //'Количество дней для скачивания',
          '', // 'Количество загрузок (раз)',
          '' //'Фотография'
        );
    }

    /**
     * Text
     *
     * @param int $size -
     * @return string
     */
    function mem_convert($size)
    {
      $unit=array('b','kb','mb','gb','tb','pb');
      return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
    }
  }
?>


Яндекс.Метрика