Переводим 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]; } } ?>