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