Blog

Adatok importálása, exportálása

Publikálva: 2013.10.27 12:00
Adatok importálása, exportálása

Fájlok írásához, olvasásához ki ne szeretné használni a jól bevált php függvényeket, mint a file_put_contents(), file_get_contents(), vagy a kedvenc simpleXML osztályunkat? Ezt mindaddig kényelmes használni, míg adataink nem híznak meg akkorára, hogy olvasásuk vagy írásuk során ne kapnánk súlyos hibát. Ilyenkor az engedélyezett memória terület el fog fogyni. Van megoldás, hogy kedvenc függvényünket használhassuk, és az engedélyezett memóriába is bőven be fogunk férni.

Fájlok írására és olvasására rengeteg eszköz áll rendelkezésre. Nálam mindig az a nyerő, amit a legkönnyebb és legkényelmesebb használni. Éppen ezért most nem is foglalkozok a jól ismert fopen() php függvénnyel. Fájlművelet során ezt tanítják meg mindenhol elsőként. Illetve ha XML állományról van szó, akkor elérhető céleszköz is.

Importáljunk XML állományból

Nézzük meg azt az esetet, amikor adatokat importálnánk XML fájlból. Egy webshop esetén, aminek több ezres termék adatbázisa is lehet, már könnyen belefuthatunk a memory_limit hibába. A szeretett simpleXML osztályunk használhatatlan lesz, hacsak nem használunk egy közbeiktatott eszközt, az XMLReader-t.

Az XMLReader osztályt véleményem szerint körülményesebb használni, mint a simpleXML-t. Így arra gondoltam, hogy használom a kettőt kombinálva. Így kihasználom az XMLReader mutatós olvasását és ötvözöm a simpleXML könnyed kezelhetőségével.

<?php
$reader = new XMLReader();
if(is_object($reader) && $reader->open($xml_file)){
	
	// Álljunk az első <item> elemre
	while($reader->read() && $reader->name!=='item');
	do{
		if($item = simplexml_load_string($reader->readOuterXml())){
			if(is_object($item) && count($item)){
				$id = (int)$item->id;
				$state = (int)$item->state;
				$price = (int)$item->price;
				
				// dolgozzunk az adatokkal
			}
		}
	}while($reader->next('item'));

	$reader->close();
}
?>

Gyakorlatilag csak annyi az egész, hogy az XMLReader-rel bejárom a termék elemeket egyesével. Miközben a termék adatokat, ahol a hasznos adatok találhatóak, már a simpleXML-t használom. Ennyire egyszerű gigászi adatokat importálni XML fájlból.

Exportáljuk adatainkat

Most nézzük meg azt az esetet is, amikor az adatokat szeretnénk exportálni. Vegyük ismét a fenti webshop estét. Laikusként korábban én is azt csináltam, hogy szépen egy változóba összeszedtem a kiírni kívánt adatokat. Majd mikor befejeztem az adatok összegyűjtését akkor írtam ki fájlba a file_put_contents() függvénnyel. Ez a webshop indulásakor jól is működött, majd miután megduzzadt a termékszám az import-export használhatatlanná vált.

Hogy tudnánk gigászi méretű adatmennyiséget fájlba küldeni, úgy hogy továbbra is a file_put_contents() php függvényt használhassuk?

<?php
function fileWriter($fileName, $data, $newFile = false){
	if(!$newFile){
		file_put_contents($fileName, $data, FILE_APPEND);
	}else{
		file_put_contents($fileName, $data);
	}
}

fileWriter($xml_file, '<?xml version="1.0" encoding="UTF-8"?>', true);
fileWriter($xml_file, '<webshop_products>');
	fileWriter($xml_file, '<items>');
	while($products){
		fileWriter($xml_file, 
		'<item>
			<state>1</state>
			<price>150</price>
			<name><![CDATA[Termék neve]]></name>
		</item>');
	}
	fileWriter($xml_file, '</items>');
fileWriter($xml_file, '</webshop_products>');
?>

Használjuk ki a FILE_APPEND kapcsolót. Az első fájlművelet során simán hozzuk létre a fájlt. És a további írás során már használjuk a FILE_APPEND kapcsolót. Így az új adatokat az állományunk végére fogja írni.

A fenti példák roppant egyszerűek, kombinált használatukat mindenképpen javaslom. Sosem lehet tudni, hogy a korábban még importálható, exportálható adatunk mikor fog meghízni. Természetesen van még számos lehetőség a fájlműveletekhez, számomra az volt a cél, hogy a már eddig is jól bevált, berögzült eljárásokat, függvényeket használjam.

Címke: php, xml