PHP analyse de fichiers texte

mmoussouni Messages postés 339 Statut Membre -  
mmoussouni Messages postés 339 Statut Membre -
Bonjour,
Je souhaite faire un site en HTML-PHP-CSS pour télécharger et se renseigner sur les paquets dpkg. Je dispose fichiers d'index de ce type : (plusieurs paquets par fichiers séparé par un saut de ligne double)

Package: apt
Priority: important
Section: admin
Installed-Size: 6204
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: APT Development Team <deity@lists.debian.org>
Architecture: i386
Version: 0.8.13.2ubuntu2
Replaces: manpages-pl (<< 20060617-3~)
Provides: libapt-pkg4.10
Depends: libc6 (>= 2.8), libgcc1 (>= 1:4.1.1), libstdc++6 (>= 4.5), zlib1g (>= 1:1.2.2.3)
Recommends: ubuntu-keyring, gpg
Suggests: aptitude | synaptic | wajig, dpkg-dev, apt-doc, bzip2, lzma, python-apt
Conflicts: python-apt (<< 0.7.93.2~)
Filename: pool/main/a/apt/apt_0.8.13.2ubuntu2_i386.deb
Size: 2100008
MD5sum: 74511271a1636702bdff86679b7bf1f8
SHA1: 307098d2526624d76663e546a03ce49df6e4556c
SHA256: 17b4618512937027c33593f8b3eb7741d8dc694a9e940bdd9e2b512088c0cad7
Description: Advanced front-end for dpkg
 This is Debian's next generation front-end for the dpkg package manager.
 It provides the apt-get utility and APT dselect method that provides a
 simpler, safer way to install and upgrade packages.
 .
 APT features complete installation ordering, multiple source capability
 and several other unique features, see the Users Guide in apt-doc.
Bugs: https://bugs.launchpad.net/ubuntu/+filebug/+login
Build-Essential: yes
Origin: Ubuntu
Supported: 18m
Task: minimal


Je souhaiterais créer une classe "apt" (ligne package) contenant les variables texte priority, section, installed-size, maintainer, ... et les listes de texte depends, recommends, suggests, conflicts, ...

Le résultat ressemblerait à ça : https://packages.ubuntu.com/fr/natty/apt

Merci d'avance.


A voir également:

3 réponses

ktm620enduro Messages postés 377 Statut Membre 38
 
est ce que tu veux extraire en php les données texte de ce fichier ? si oui c'est possible par une expression régulière ... et je peux te le faire, sinon je ne sais pas...
0
mmoussouni Messages postés 339 Statut Membre 38
 
le probleme c'est que les 4 fichiers font plus d'un million de lignes. Mais j'ai trouvé, avec un problème : j'ai du augmenter la limite de mémoire vive maximale pour php, ainsi que le temps d'éxecution maximal.
Résumé : La page devrait extraire ce qui est placé à droite des ":" et le placer dans le champ MySQL correspondant à ce qui est à gauche.
Code actuel (commenté) :
<?php
include('../resources/functions.php');
is_admin(1);									// Pour l'intégration future //
$alert=fopen('../resources/updating.env','r+');	          // Permet au site de se couper lors de la maj de la db //
fwrite($alert,'TRUE ');
connect_db();                   // On comprends... //
$table=array('natty_main_binaryi386','natty_multiverse_binaryi386','natty_restricted_binaryi386','natty_universe_binaryi386');
$champs=array("package","priority","section","installed_size","maintainer","original_maintainer","architecture","version","replaces","provides","depends","recommends","suggests","conflicts","filename","size","md5","sha1","sha256","description","bugs","build_essential","origin","supported","task","homepage",);
$champs_r=array("Package","Priority","Section","Installed-Size","Maintainer","Original-Maintainer","Architecture","Version","Replaces","Provides","Depends","Recommends","Suggests","Conflicts","Filename","Size","MD5sum","SHA1","SHA256","Description","Bugs","Build-Essential","Origin","Supported","Task","Homepage");
for($k=0;$k<count($table);$k++)
{
	$index=fopen('../resources/index/'.$table[$k],'r');

	req_sql('DELETE FROM '.$table[$k]);                // Ma fonction de requete MySQL qui gère aussi les erreurs //
	$nb_l=count(file('../resources/index/'.$table[$k]));
	echo('Nombre de lignes l : '.$nb_l.'<br />');

        $nb_c=count($champs);
	for($j=0;$j<$nb_c;$j++)
	{
		${$champs[$j]}=NULL;
	}

	for($i=0;$i<$nb_l;$i++)
	{
		$temp=fgets($index);
		$temp=rtrim($temp);
		$temp=str_replace('\'','-',$temp);
		$temp=str_replace('"','-',$temp);
		if(strlen(rtrim($temp))==0)
		{
			req_sql('INSERT INTO '.$table[$k].' VALUES("","'.$package.'","'.$priority.'","'.$section.'","'.$installed_size.'","'.$maintainer.'","'.$original_maintainer.'","'.$architecture.'","'.$version.'","'.$replaces.'","'.$provides.'","'.$depends.'","'.$recommends.'","'.$suggests.'","'.$conflicts.'","'.$filename.'","'.$size.'","'.$md5.'","'.$sha1.'","'.$sha256.'","'.$description.'","'.$bugs.'","'.$build_essential.'","'.$origin.'","'.$supported.'","'.$task.'","'.$homepage.'")');
			for($j=0;$j<$nb_c;$j++)
			{
				${$champs[$j]}=NULL;
			}
		}
		else
		{
			if(preg_match('/:/i',$temp))
			{
				$ligne=explode(':',$temp,2);
				for($j=0;$j<$nb_c;$j++)	
				{
					if($ligne[0]==$champs_r[$j])
					{
						${$champs[$j]}=$ligne[1];
						$bfr=$champs[$j];
					}
				}
			}
			else
			{
				${$bfr}=${$bfr}.' '.$temp;
			}
		}
	}

	fclose($index);
}
fseek($alert,0);
fwrite($alert,'FALSE');
fclose($alert);
mysql_close();
echo("<br />ok");
?>


C'est un peu (beaucoup) chaotique mais ca marche. Reste à améliorer le temps d'éxecution et la mémoire utilisée.....
0