begin process at 2012 02 15 08:37:30
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

 > BASH: TABLEAUX EN FICHIER

BASH: TABLEAUX EN FICHIER


 Information sur la source

Note :
Aucune note
Catégorie :Astuces Classé sous :bash, tableaux, fichier, mémoire Niveau :Débutant Date de création :02/06/2008 Date de mise à jour :02/06/2008 17:39:19 Vu :4 661

Auteur : gentilKiki

Ecrire un message privé
Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

 Description

Peut etre vous etes vous deja retrouvé dans la situation ou vous devez enregistrer dans un tableaux plusieurs milliers d'entrées.
Le problème pour moi c'est posé, j'ai donc décidé de mette ce tableau dans un fichier.
Autant prévenir de suite, cette solution offre le désavantage d'etre très lent, mais d'un autre coté, elle préserve les ressources mémoire allouées a php, ce que je désirai.
De plus, j'ai prévu un switch entre gestion par fichier et gestion en mémoire, au cas ou ;)
Prérequis:
Il faut impérativement accés a une commande grep, en effet, cette classe lors de la lecture du tableau vient 'greper' le fichier pour trouver la ligne qui l'interresse.

Le concept:
En instanciant la class ArrayFile, on créé un fichier dans le répertoire temporaire de votre choix. Le stockage d'une variable dans ce tableau se fait par la methode add. Cette methode ecrit dans le fichier une ligne représentant l'index/key du tableau, et sa variable sérializée.
La lecture se fait par la methode get tout simplement.
Ex:
//note: le nom du tableau n'est pas obligatoire, mais il peut s'avérer interressant de retrouver le fichier que l'on a creer

$monBeauTableau = new ArrayFile('monTableau');
//ici pas besoin d'index, on incrémente automatiquement
$monBeauTableau->add('ma premiere valeur');

//ici on force l'index (15)
$monBeauTableau->add('ma seconde valeur avec un index définit',15);

//valeur index par une clé type string (cleTrois)
$monBeauTableau->add('ma troisième valeur avec clé','cleTrois');


Un accés directe a une valeur pourra etre possible via l'instruction 'get':
echo $monBeauTableau->get('cleTrois');
// resultat : ma troisième valeur avec clé

echo $monBeauTableau->get(15);
// resultat : 'ma seconde valeur avec un index définit'

Enfin, pour lister la totalité d'un tableau un simple foreachLine:
while(list($key,$value) = $monBeauTableau->foreachLine()){
echo "key = $key ";
print_r($value)."\n";
}

//unset du tableau
$monBeauTableau->unsetArray();

Un cas particulier:
si plusieurs add sont fait sur la meme clé, le get de cette clé renverra toutes les valeurs de cette clé.
Pour retourner, la dernière valeur, il faut utiliser la methode 'getUniq' au lieu de 'get'.

Source

  • <?
  • class ArrayFile{
  • var $dirTmp = '/var/tmp/';
  • var $handleW = null;
  • var $handleO = null;
  • var $index = null;
  • var $separator = '##';
  • /*
  • permet de switcher entre le mode fichier (très lent mais peu gourmand)
  • et mémoire (rapide mais très gourmand)
  • */
  • var $typeOfStorage = 'file';//[file|mem]
  • var $aData = null;
  • /**
  • *Constructor
  • *$param: arrayName
  • *$param: dirTmp
  • *$param: typeOfStorage
  • **/
  • function ArrayFile($arrayName='',$dirTmp='',$typeOfStorage = 'file'){
  • $this->typeOfStorage = $typeOfStorage;
  • if($this->typeOfStorage == 'file'){
  • if(!$arrayName) $arrayName = uniqid(rand());
  • if($dirTmp!='' && is_dir($dirTmp)) $this->dirTmp = $dirTmp;
  • if(!is_dir($this->dirTmp.'arrayFile')) mkdir($this->dirTmp.'arrayFile');
  • $this->dirTmp .='arrayFile/';
  • $this->arrayName = date('Ymd_his').'_'.$arrayName;
  • if(file_exists($this->dirTmp.$this->arrayName)) $this->rmFile();
  • $this->handleW = fopen($this->dirTmp.$this->arrayName,'a');
  • $this->handleO = fopen($this->dirTmp.$this->arrayName,'r');
  • }
  • }
  • /**
  • *
  • *
  • **/
  • function rmFile(){
  • exec("rm ".$this->dirTmp.$this->arrayName);
  • }
  • /**
  • * Empilage de $varMixed par index
  • *
  • *
  • **/
  • function add($varMixed,$index=''){
  • if(!$index){
  • if(!$this->index) $this->index = 0;
  • $mindex = $this->index;
  • }else{
  • $mindex = $index;
  • }
  • if($this->typeOfStorage == 'file'){
  • fwrite($this->handleW,$this->separator.$mindex.$this->separator.serialize($varMixed)."\n");
  • }else{
  • $this->aData[$mindex][] = $varMixed;
  • }
  • if(!$index) $this->index++;
  • }
  • /**
  • *Retourne toutes les occurences $index
  • *
  • **/
  • function get($index){
  • if($index=='') return false;
  • if($this->typeOfStorage == 'file'){
  • $result = shell_exec("grep '".$this->separator.$index.$this->separator."' ".$this->dirTmp.$this->arrayName." 2>&1");
  • $result = explode("\n",trim($result));
  • //si vide
  • if($result[0]=='' && count($result)==1) return false;
  • if(!is_array($result)) return false;
  • foreach($result as $line){
  • $aTmp = explode($this->separator,trim($line));
  • $aArray[] = unserialize($aTmp[2]);
  • }
  • }else{
  • $aArray = $this->aData[$index];
  • }
  • return $aArray;
  • }
  • /**
  • *Ne retourne que le dernier élément ajouté pour index $index
  • *
  • **/
  • function getUniq($index){
  • if($index=='') return false;
  • $aResult = $this->get($index);
  • if(!is_array($aResult)) return false;
  • return array_pop($aResult);
  • }
  • /***
  • * while(list($key,$value) = $aAlbum->foreachLine()){
  • echo "key = $key ";
  • print_r($value)."\n";
  • }
  • *
  • **/
  • function foreachLine(){
  • if($this->typeOfStorage == 'file'){
  • if(!feof($this->handleO)){
  • $line = fgets($this->handleO, 4096);
  • $aTmp = explode($this->separator,trim($line));
  • if($aTmp[1]!=''){
  • return array($aTmp[1],unserialize($aTmp[2]));
  • }else{
  • return $this->foreachLine();
  • }
  • }else{
  • fseek($this->handleO, 0);
  • }
  • }else{
  • list($k,$d) = each($this->aData);
  • if($d!='') return array($k,$d);
  • reset($this->aData);
  • return false;
  • }
  • return false;
  • }
  • /**
  • *
  • *
  • **/
  • function unsetArray(){
  • if($this->typeOfStorage == 'file'){
  • fclose($this->handleW);
  • fclose($this->handleO);
  • $this->rmFile();
  • }else{
  • unset($this->aData);
  • }
  • }
  • }
  • ?>
<?
class ArrayFile{
	var $dirTmp = '/var/tmp/';
	var $handleW = null;
	var $handleO = null;
	var $index = null;
	var $separator = '##';
	
	
	/*
		permet de switcher entre le mode fichier (très lent mais peu gourmand) 
		et mémoire (rapide mais très gourmand)
	*/
	var $typeOfStorage = 'file';//[file|mem] 
	var $aData = null;
/**
*Constructor
*$param: arrayName
*$param: dirTmp
*$param: typeOfStorage 
**/	
	function ArrayFile($arrayName='',$dirTmp='',$typeOfStorage = 'file'){
		$this->typeOfStorage = $typeOfStorage;
		if($this->typeOfStorage == 'file'){
			if(!$arrayName) $arrayName = uniqid(rand());
			if($dirTmp!='' && is_dir($dirTmp)) $this->dirTmp = $dirTmp;
			if(!is_dir($this->dirTmp.'arrayFile')) mkdir($this->dirTmp.'arrayFile');
			
			$this->dirTmp .='arrayFile/';
			$this->arrayName = date('Ymd_his').'_'.$arrayName;
			
			if(file_exists($this->dirTmp.$this->arrayName)) $this->rmFile();
			
			$this->handleW = fopen($this->dirTmp.$this->arrayName,'a');
			$this->handleO = fopen($this->dirTmp.$this->arrayName,'r');
		}
	}
	
	
/**
*
*
**/
	function rmFile(){
		exec("rm ".$this->dirTmp.$this->arrayName);	
	}
	
	
	
/**
* Empilage de $varMixed par index
*
*
**/
	function add($varMixed,$index=''){
		
		if(!$index){
			if(!$this->index) $this->index = 0;
			$mindex = $this->index;
		}else{
			$mindex = $index;
		}
		if($this->typeOfStorage == 'file'){
			fwrite($this->handleW,$this->separator.$mindex.$this->separator.serialize($varMixed)."\n");
		}else{
			$this->aData[$mindex][] = $varMixed;
		}
		if(!$index) $this->index++;
	}
	
	
/**
*Retourne toutes les occurences $index
*
**/		
	function get($index){
		if($index=='') return false;
		if($this->typeOfStorage == 'file'){
			$result = shell_exec("grep '".$this->separator.$index.$this->separator."' ".$this->dirTmp.$this->arrayName."  2>&1");
			$result = explode("\n",trim($result));
			//si vide
			if($result[0]=='' && count($result)==1) return false;
			
			if(!is_array($result)) return false;
			foreach($result as $line){
				$aTmp = explode($this->separator,trim($line));
				$aArray[] = unserialize($aTmp[2]);	
			}
		}else{
			$aArray = $this->aData[$index];
		}
		return $aArray;
	}
	
	
/**
*Ne retourne que le dernier élément ajouté pour index $index
*
**/		
	function getUniq($index){
		if($index=='') return false;
		$aResult = $this->get($index);
		if(!is_array($aResult)) return false;
		
		return array_pop($aResult);
	}
	
	
		
/***
* while(list($key,$value) = $aAlbum->foreachLine()){
	echo "key = $key ";
	print_r($value)."\n";
}
*
**/	
	function foreachLine(){
		
		if($this->typeOfStorage == 'file'){
			if(!feof($this->handleO)){
				$line = fgets($this->handleO, 4096);
				$aTmp = explode($this->separator,trim($line));
				if($aTmp[1]!=''){
					return array($aTmp[1],unserialize($aTmp[2]));
				}else{
					return $this->foreachLine();
				}
			}else{
				fseek($this->handleO, 0);
			}
		}else{
			list($k,$d) = each($this->aData);
			if($d!='') return array($k,$d);
			reset($this->aData);
			return false;
		}
		return false;
	}
/**
*
*
**/
	function unsetArray(){
		if($this->typeOfStorage == 'file'){
			fclose($this->handleW);
			fclose($this->handleO);
			$this->rmFile();
		}else{
			unset($this->aData);
		}
	}
}

?>

 Conclusion

Si vous n'avez pas peur de ralentir votre script, et si la mise en tableau demande beaucoup de ressource mémoire, alors voila une solution. L'autre solution consiste a allouer plus de mémoire a php via la config.


 Historique

02 juin 2008 17:38:00 :
couleur code
02 juin 2008 17:39:19 :
couleur..;(grrr)

 Sources du même auteur

Source avec Zip Source avec une capture BASH CSVSQL: PARSER UN FICHIER CSV AVEC DES COMMANDES SQL
Source avec une capture AJOUTER DE LA COULEUR A VOS BASH PHP

 Sources de la même categorie

Source avec Zip Source avec une capture GENERATEUR D'ONGLET DE NAVIGATION PHP par pos123
FORMATER UN LIEN YOUTUBE, DAILYMOTION OU VIMEO POUR L'UTILIS... par kgb93
Source avec Zip Source avec une capture PAGINATION + FICHIER CSS par profdi
Source avec Zip Source avec une capture SYSTEME D'AUTHENTIFICATION PHP AVEC PROTÉCTION KEYLOGGER par mtrix000
Source avec Zip Source avec une capture GENERATEUR DE BOUTONS DE PARTAGES POUR RESEAUX SOCIAUX par cod57

 Sources en rapport avec celle ci

CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
UPLOADER DES FICHIER DANSUN DOSSIER, SÉCURISÉ AVEC MOT DE PA... par raizzo
COMPTEUR DE VISITES SUR FICHIER par pierreSabatier
Source avec Zip CLASSE D'OBJET DE RECHERCHE DE MOTS DANS DES TABLEAUX ET/OU ... par 8Tnerolf8
Source avec Zip Source avec une capture A-ANNONCES VERSION PHP 5 par cod57

Commentaires et avis

Commentaire de coucou747 le 02/06/2008 19:15:12 administrateur CS

$result = shell_exec("grep '".$this->separator.$index.$this->separator."' ".$this->dirTmp.$this->arrayName." 2>&1");
ouch.... c'est assez porc comme methode... utiliser mysql ou autre aurait ete une meilleur solution...
bref.... ou a la limite, faire un fichier temporaire ./Array/nom_du_tableau/clef qui contiendrait le contenu.

proposition d'amelioration :
tu devrais passer a php5, et utiliser la classe ArrayAccess, histoire de pouvoir faire tout ca de facon transparente.

sinon, qu'arrive t'il dans le cas d'un tableau bidimentionnel ?

Commentaire de codefalse le 02/06/2008 19:40:12 administrateur CS

et je rajouterai que l'usage de la spl serait ici un plus non n?gligeable ! :)

Commentaire de coucou747 le 02/06/2008 20:35:05 administrateur CS

ArrayAccess c'est dans la SPL...

Commentaire de codefalse le 02/06/2008 21:38:20 administrateur CS

En fait je me suis mal exprim?, mais je voulais surtout parler des Iterator et compagnie, s'il n'utilise pas ArrayAccess, ce sera mieux. Apr?s en effet ArrayAccess est dans la SPL.

Commentaire de gentilKiki le 02/06/2008 23:29:27

Salut,
Oui bien sur, je pourrai utiliser tout un tas de choses bien plus pratiques tel que php5, mysql et porquoi pas, un autre langage. Mais voila, je ne dispose pas a ma guise d'une base de données, ni de l'administration du serveur. J'oublie souvent que les devs d'autres boites ont plus de droits que moi.
J'aurai du le mettre en préambule;)
Maintnenant, je reconnais que la solution du grep est plus que bourrine, mais n'ayant pas grand chose a dispo, je la trouve 'adaptée'.

Commentaire de codefalse le 02/06/2008 23:39:35 administrateur CS

On ne te demande pas d'utiliser un autre langage, juste d'avoir un serveur ? jour :p
Php4 c'est mort, php6 va bientot sortir, alors php5, c'est la moindre des choses. Sinon autant tourner sur du windows 95 pour coder :D

Commentaire de gentilKiki le 02/06/2008 23:54:40

Je ne code que pour le boulot.
Tu veux que je te mette en relation avec mes admins ?;)
Vous aurez beau dire, je n'y peux malheureusement rien;) C'est une réalité, je code avec (meme si c'est parfois gavant).

Commentaire de coucou747 le 02/06/2008 23:54:46 administrateur CS

codefalse, beaucoup d'entreprises disent : tant que ca marche, on garde...

sinon, dans ce cas precis, arrayacces serait plus approprie qu'un iterator...

Commentaire de codefalse le 02/06/2008 23:58:57 administrateur CS

Je sais je connais le probl?me :p
Mais c'est pas magnifique de se prendre la t?te lors des migrations ??? :p
Serveur inaccessible, clients m?contants, prises de t?tes, c'est trop bien ! ;)

Commentaire de gentilKiki le 03/06/2008 00:02:01

Le fait de passer de php4 a php5 est un risque sur une appli existante, dont une société dépend, du coup, Coucou747 a raison. Toutefois, cette société se prive aussi d'avantage que pourrait lui aporter une nouvelle version, sans parler des devs qui se sentent de plus en plus a la rue....
Mais on en reparlera au bar si vous voulez;)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Upload de très gros fichier. [ par alexflex25 ] Bonjour, Je me tourne à nouveau vers vous pour profiter de vos connaissances (inépuisables) Peut-on « uploader » un fichier d'une taille supérieur à Lister répertoir avec lien ?? [ par Bobyco ] Bonjours a tous le monde. Je voudrais créer une page qui listerai mon répertoire musique du site. Mais je ne suis qu'un débutant & je n'est pas trouv Lire mon fichier csv a partir de la deuxième ligne [ par wcrack ] [code=php] <?php $row=1; $n=1; // cela va nous permettre de passer d'une ligne à l'autre. $fichier = $_FILES['fichier']['name'] ; $elementsChemin = inserrer des fichier ou images dans ma base de donne o en php (base mysql) [ par msi079 ] salut je veux insérer des images des victimes ( la base est créer pour identifier et enregistrer des victimes de guerre ) de guerre mais j'arrive pas. PHP avec interface R [ par belzebate ] Bonjour à tous et à toutes. Je suis étudiant en L3 MIAGE et je suis actuellement un stage pour valider mon année. Mon projet est de créer une platefo upload Fichier Mp3 vers dossier sur ftp [ par jbtv ] Bonsoir a tous !!!! je souhaiterai pouvoir envoyer des fichier de type .mp3 sur mon serveur ftp dans un dossier nommé "files" la source est bonne ma téléchargement de fichier de puis serveur [ par nouvinfo ] Bonjour, Je suis un novice. voici ce que je fais: J'ai crée un formulaire dans une page.php ('formulaire_entrer_donnee.php'). Ce formulaire permet d MYSQL bloquer fichier [ par nbpro ] bonjour, existe-il une option qui permet de na pas afficher tel ou tel fichier lord de l'affichage des données " select ... Moins fichier a caché". problème avec récupération $_POST [ par Parisssi ] bonjour voila ça 2 jours que je n'arrive pas à résoudre mon problème. J'ai le formulaire suivant et je n'arrive pas à récupérer le contenu de ma varia soucis de formulaire d'envoie de fichier et checkbox [ par belzebate ] Bonjour/bonsoir tout le monde, Alors voici ma situation: J'ai un formulaire d'envoi de fichier suivis, dans ce même formulaire, d'une liste de 6 che


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,668 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales