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