IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Analyse d'un fichier texte et création de l'arborescence


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juillet 2007
    Messages : 41
    Points : 54
    Points
    54
    Par défaut Analyse d'un fichier texte et création de l'arborescence
    Bonjour à tous,

    J'ai un fichier au format gedcom de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    0 INDI
    1 NAME
    1 SEX
    1 BIRT
    2 DATE
    2 NOTE
    2 PLAC
    2 OBJE
    3 FORM
    3 FILE
    2 NOTE
    1 DEAT
    2 DATE
    2 PLAC
    2 OBJE
    3 FORM
    3 FILE
    1 FAMC
    1 FAMS
    1 RIN
    1 CHAN
    2 DATE
    3 TIME
    et je voudrais le transformer par PHP en un fichier xml de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <INDI>
    	<NAME></NAME>
    	<SEX></SEX>
    	<BIRT>
    		<DATE></DATE>
    		<NOTE></NOTE>
    		<PLAC></PLAC>
    		<OBJE>
    			<FORM></FORM>
    			<FILE></FILE>
    		</OBJE>
    		<NOTE></NOTE>
    	</BIRT>
    	<DEAT>
    		<DATE></DATE>
    		<PLAC></PLAC>
    		<OBJE>
    			<FORM></FORM>
    			<FILE></FILE>
    		</OBJE>
    	</DEAT>
    	<FAMC></FAMC>
    	<FAMS></FAMS>
    	<RIN></RIN>
    	<CHAN>
    		<DATE></DATE>
    		<TIME></TIME>
    	</CHAN>
    </INDI>
    j'arrive bien à ouvrir et fermer le tag sur la même ligne mais pas à le fermer plus loin dans le code en gardant la tabulation (voir <BIRT> et </BIRT>).

    Comment dois je faire ?

  2. #2
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut
    Salut

    il faut que tu postes ton code sinon difficile de deviner une solution sans base d'analyse.. Les méthodes de création de xml sont multiples..

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juillet 2007
    Messages : 41
    Points : 54
    Points
    54
    Par défaut
    J'éspère que mes commentaires seront assez clairs...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    <?
    	$ext = ".lmx";
    	$header_xml = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>"."\n"."<individu>"."\n";
    	$footer_xml = "</individu>";
     
    	function id($val_ligne)
    	{
    		return intval(substr($val_ligne,0,1));
    	}
     
    	function tag($val_ligne)
    	{
    		$result = substr(substr($val_ligne,2),0,strpos(substr($val_ligne,2)," "));
    		if ($result == null)
    		{
    			$result = trim(substr(substr($val_ligne,2),0,strpos(substr($val_ligne,2),"\n")));
    		}
    		return $result;
    	}
     
    	function descript($val_ligne)
    	{
    		if (strstr(substr($val_ligne,2)," "))
    		{
    			return trim(strstr(substr($val_ligne,2)," "));
    		}
    		else {return null;}
    	}
     
    	function ExtractChamp($chaine,$entier,$sep)
    	{
    		if($entier > 0)
    		{
    			$res=strtok($chaine,$sep); //découpe la chaine en segment avec le séparateur $sep.
    			if($res!="") //si la chaîne comporte au moins une fois le séparateur alors
    			{
    				for($i=1;$i<$entier;$i++)
    				{
    					$res=strtok($sep);//passe au segment suivant
    				}
    			}
    		}else
    		{
    			$res=false;
    		}
    		return($res);//retourne le résultat
    	}
     
    	// Je récupère mon fichier txt dans un tableau
    	$handle = @fopen("./gedcom/gedcom_light.ged", "r" );
    	if ($handle)
    	{
    		while (!feof($handle))
    		{
    			$buffer = fgets($handle, 4096);
    			$tableau[] = $buffer;
    		}
    		fclose($handle);
    	}
     
    	for ($i=0;$i<sizeof($tableau);$i++)
    	{
    		$id_ligne =id($tableau[$i]); // 1er caractère de la ligne courante.
    		$tag_ligne = tag($tableau[$i]);
    		$descript = descript($tableau[$i]);
     
     
    		if ($id_ligne == "0" && ereg("INDI",$descript)) // si le 1er caractère de la ligne est un 0 cela veut dire que j'arrive sur un nouvel indi
    		{
    			if ($flag_edition_en_cours) // si j'étais en cours d'édition d'un indi 
    			{
    				fputs($Current_acces, $footer_xml); // j'écris dans le fichier le footer
    				fclose($Current_acces); // et je ferme le fichier de l'indi
    				$flag_edition_en_cours = false; // j'indique par le flag que j'ai finis l'edition de l'indi
    			}
    			$Current_Ind = ExtractChamp($tag_ligne,1,"@"); // je récupère l'identifiant de l'indi
    			$Current_xml = "./fiches/".$Current_Ind.$ext ; // je créé le fichier de l'indi
    			$Current_acces = fopen($Current_xml,"w"); // je l'ouvre en écriture
    			fputs($Current_acces, $header_xml); // j'y écris l'header
    			$flag_edition_en_cours = true; // j'indique par le flag que je suis en cours d'edition de l'indi
    		}
    		//Mon bout de code qui pose problème
     
    		// si le premier caractère de la ligne courante est < au premier caractère de la ligne suivante,
    		// le tag de la ligne courante sera parent du tag de la ligne suivante 
    		if ($id_ligne < id($tableau[$i+1]))
    		{
    			fputs($Current_acces, str_repeat("\t",$id_ligne)."<".$tag_ligne.">"."\r\n");
    			$tag_tableau[count($tag_tableau)][0] = $tag_ligne; // permet de garder l'historique des tags parents
    			$tag_tableau[count($tag_tableau)][1] = $id_ligne; // permet de garder l'historique des tabulations des tags parents
    		}
     
    		// si le premier caractère de la ligne courante est = au premier caractère de la ligne suivante,
    		// le tag de la ligne courante doit être au même niveau que le tag de la ligne suivante
    		if ($id_ligne == id($tableau[$i+1]))
    		{
    			fputs($Current_acces, str_repeat("\t",$id_ligne)."<".$tag_ligne.">"."valeur"."</".$tag_ligne.">"."\r\n");
    		}
     
    		// si le premier caractère de la ligne courante est > au premier caractère de la ligne suivante,
    		// le tag de la ligne courante doit revenir au niveau supérieure
    		if ($id_ligne > id($tableau[$i+1]))
    		{
    			fputs($Current_acces, str_repeat("\t",$id_ligne)."<".$tag_ligne.">"."valeur"."</".$tag_ligne.">"."\r\n");
    		//	fputs($Current_acces, str_repeat("\t",$id_ligne)."<".$tag_ligne.">"."\r\n");
    		//	$tag_tableau[count($tag_tableau)][0] = $tag_ligne; // permet de garder l'historique des tags parents
    		//	$tag_tableau[count($tag_tableau)][1] = $id_ligne; // permet de garder l'historique des tabulations des tags parents
    		}
    	}
    	fputs($Current_acces, $footer_xml);
    	fclose($Current_acces);
    ?>
    le fichier gedcom_light.ged :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    0 @I1@ INDI
    1 NAME prenom1 prenom2 prenom3 /NOM/
    2 GIVN prenom1 prenom2 prenom3
    2 SURN NOM
    1 SEX M
    1 OBJE
    2 TITL photo
    2 FORM jpg
    2 FILE dossier1/dossier2/fichier1.jpg
    1 BIRT
    2 NOTE @N1@
    2 DATE 11 JAN 1900
    2 NOTE teste pour php
    2 PLAC Ville,CP,Département,région,Pays,
    2 OBJE
    3 FORM jpg
    3 FILE dossier1/dossier2/fichier2.jpg
    1 FAMC @F1@
    1 FAMS @F5@
    1 OCCU metier
    2 DATE AFT JAN 2000
    1 REFN 1
    1 RIN 080111072326num
    1 CHAN
    2 DATE 1 MAR 2010
    3 TIME 07:40:21
    résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <individu>
    <@I1@>
    	<NAME>
    		<GIVN>valeur</GIVN>
    		<SURN>valeur</SURN>
    	<SEX>valeur</SEX>
    	<OBJE>
    		<TITL>valeur</TITL>
    		<FORM>valeur</FORM>
    		<FILE>valeur</FILE>
    	<BIRT>
    		<NOTE>valeur</NOTE>
    		<DATE>valeur</DATE>
    		<NOTE>valeur</NOTE>
    		<PLAC>valeur</PLAC>
    		<OBJE>
    			<FORM>valeur</FORM>
    			<FILE>valeur</FILE>
    	<FAMC>valeur</FAMC>
    	<FAMS>valeur</FAMS>
    	<OCCU>
    		<DATE>valeur</DATE>
    	<REFN>valeur</REFN>
    	<RIN>valeur</RIN>
    	<CHAN>
    		<DATE>
    			<TIME>valeur</TIME>
    </individu>
    voilà ce que je voudrais obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <individu>
    <@I1@>
    	<NAME>
    		<GIVN>prenom1 prenom2 prenom3</GIVN>
    		<SURN>NOM</SURN>
    	</NAME>
    	<SEX>M</SEX>
    	<OBJE>
    		<TITL>photo</TITL>
    		<FORM>jpg</FORM>
    		<FILE>dossier1/dossier2/fichier1.jpg</FILE>
    	</OBJE>
    	<BIRT>
    		<NOTE>@N1@</NOTE>
    		<DATE>11 JAN 1900</DATE>
    		<NOTE>teste pour php</NOTE>
    		<PLAC>Ville,CP,Département,région,Pays,</PLAC>
    		<OBJE>
    			<FORM>jpg</FORM>
    			<FILE>dossier1/dossier2/fichier2.jpg</FILE>
    		</OBJE>
    	</BIRT>
    	<FAMC>@F1@</FAMC>
    	<FAMS>@F5@</FAMS>
    	<OCCU>
    		<DATE>AFT JAN 2000</DATE>
    	</OCCU>
    	<REFN>1</REFN>
    	<RIN>080111072326num</RIN>
    	<CHAN>
    		<DATE>
    			<TIME>07:40:21</TIME>
    		</DATE>
    	</CHAN>
    </individu>

Discussions similaires

  1. Analyse d'un fichier texte faiblement structuré
    Par jfv.work dans le forum Développement de jobs
    Réponses: 4
    Dernier message: 08/08/2011, 08h59
  2. Analyse d'un fichier texte
    Par p2w.walas dans le forum Langage
    Réponses: 2
    Dernier message: 27/08/2009, 16h19
  3. Probleme casse fichier texte avec création table SAS
    Par pierre24 dans le forum SAS Base
    Réponses: 4
    Dernier message: 16/05/2008, 10h52
  4. Création d'un fichier texte
    Par licorne dans le forum Langage
    Réponses: 9
    Dernier message: 25/10/2005, 17h05
  5. [AC97] création d'un fichier texte
    Par pokemoon94 dans le forum VBA Access
    Réponses: 5
    Dernier message: 05/10/2004, 14h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo