Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/02/2012, 13h57   #1
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Par défaut parser un txt

Bonjour a tous,

je suis debutant en PHP et je voudrais faire un exercice un peu compliqué.

J'ai 2 fichiers appelons les data et keys
Dans le fichier data j'ai une serie de registres (ce sont des doc biliographiques).
Dans le segond fichier j'ai a peu pret la meme chose + des ID.
Chaque ID est unique et correspond a une chaine bien specifique.

Pour diferencier les registres du fichier data, l'on peu utiliser le premier champ
=LDR
un ligne blanche separe les registre, voici un exemple du fichier:

Code :
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
=LDR  01228nam  2200301 b 4500
=001  00000000000001
=005  20090429:10082000
=008  060403\2004\\\\\\\\\\\\\\\\\\\\\\\\baq
=008  120114s9999\\\\xx\\\\\\\\\\\\000\0\und\d
=019  \\$aM-34416-2004
=020  \\$a84-667-3834-7
=027  \\$a11100
=024  \\\$a9
=100  1\$aFerrero, Luis
=245  10$aMatematika$b :2:  Irakasleentzako materiala$c / Luis Ferrero, María del Carmen Jiménez, María Gregoria Martín
=260  \\$aMadrid$b : Anaya-Haritza$c, 2004
=300  \\$a4 bolumen dituen karpeta  (159, 31, 39, 95 or.)$c ; 32 x 26 cm
=440  \0$aApain eta dotore
=500  \\$a2004.10.19
=505  0\$a1. bolumena: Proposamen didaktikoa$a -- 2. bolumena: Programazioa$a -- 3. bolumena: Ebaluazioa$a -- 4. bolumena: Aniztasunaren tratamendua
=521  0\$a2.maila
=650  \4$aLMH - Matematika
=700  1\$aJimenez, Maria del Carmen
=700  1\$aMartín, María Gregoria
=856  \\$u http://www.anaya.es$z Argitaletxearen web-orria
=856  \\$u http://www.hezkuntza.ejgv.euskadi.net/r43-573/eu/contenidos/informacion/dih6/eu_15733/adjuntos/8466738347.pdf$z Aurkibidea
=952  \\$p1000001$8LH$d05/04/06$aEK$bEK$oI LH2 MAT 1 04$eANA$s05/04/06
=998  \\9
 
=LDR  01239nam  2200373 b 4500
=001  00000000000003
=005  20081212:09412200
...
et ainsi de suite.

l'exercice consiste a parser le champ 650 du fichier data:
Code :
=650  \4$aLMH - Matematika
Ça peu aussi etre comme ceci:
Code :
1
2
3
=650  \4$a Etika
=650  \4$aPatristika
=650  \4$aFilosofia
ou comme ceci:
Code :
=650  \4$aMusika$x-Historia eta kritika
ou encore:
Code :
=650  \4$a Haurren heziketa$j-Ipuinak$j-Haur eta gaztentzako liburuak
Les champs 650 sont composés de sous champs visibles par des lettres.
a, ou x ou j ou y, z

Pour toutes les combinaisons du fichier data il existe une correspondance dans le fichier keys.
L'ecercice consiste a recuperer l'ID du fichier keys et de le coller a la fin de la ligne 650 du fichier data.

voici comment se presente les données dans keys:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
..MARC..
TITN
     15
LD05
     n
LD06
     a
LD07
     m
LD18
     b
T001
     00000000000006
T005
     20091214:11502100
T008
     060403s2005    espa   c      000 1 baq c
T019
...
T650
     ' 4''a' Haurren heziketa'j'-Ipuinak'j'-Haur eta gaztentzako liburuak'ZZ0004537'
..MARC
Voyez dans le fichier keys, j'ai aussi un champs 650 (T650) et il termine par un numero...C'est ce numero que je soouhaite recuperer.

Dans notre exemple ça serait:

Code :
=650  \4$a Haurren heziketa$j-Ipuinak$j-Haur eta gaztentzako liburuak$90004537

J'ai commencer avec ce petit bout de code, mais je sais pas comment mettre dans une variable une chaine et ensuite la comparer dans l'autre fichier:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?
if (!$fp = fopen("cata.txt","r")) {
echo "Echec de l'ouverture du fichier";
exit;
}
else {
	while(!feof($fp)) {
	// On récupère une ligne
		$Ligne = fgets($fp,255);
 
	// On affiche la ligne
		echo $Ligne;
 
	// On stocke l'ensemble des lignes dans une variable
		$Fichier .= $Ligne;
	}
	fclose($fp); // On ferme le fichier
}
 
?>
J'aurais besoin de quelque clefss s'il vous plait.
Cordialement
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 15h46   #2
Membre éclairé
 
Avatar de humitake
 
Homme Olivier
Étudiant
Inscription : novembre 2010
Messages : 303
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 20
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2010
Messages : 303
Points : 384
Points : 384
Bonjour,

Citation:
Envoyé par Idiaz
je suis debutant en PHP et je voudrais faire un exercice un peu compliqué.
Ah ah ! Pardon
C'est en se lançant des défie qu'on progresse

Alors si j'ai bien compris tu souhaite récupérer cette ligne :
Code :
' 4''a' Haurren heziketa'j'-Ipuinak'j'-Haur eta gaztentzako liburuak'ZZ0004537'
Et plus particulierement le numéro à la fin : 'ZZ0004537'.

Est-ce que tous les numéros que tu souhaites récupéré possède des ' en début et fin de chaîne ?

Si c'est le cas ce serra très simple avec explode().

Citation:
Envoyé par Idiaz
je sais pas comment mettre dans une variable une chaine
Rien de plus simple il te suffit d'écrire $maVar = $Ligne; une fois que tu est sûr que c'est la bonne. Et il faut bien évidement déclarer la variable avant la boucle pour pouvoir l'utiliser à l'exterieur.
humitake est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 16h10   #3
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Salut
oui tous les numero du fichier keys ont des '' pour delimieter.

Le probleme c'est que si un champs 650 possede la lettre a x et j
c'est different de la meme chose avec a et x
ou a et z
Meme si a possede la meme valeur.

Et en plus, comment passer l'ID au fichier data et le coller a la bonne place?
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 16h41   #4
Futur Membre du Club
 
Homme
Étudiant
Inscription : mai 2011
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2011
Messages : 22
Points : 19
Points : 19
Je n'ai pas très bien compris ce que tu souhaite faire, mais tu devrais te diriger vers les regex (expressions régulières), c'est assez lourd mais pratique.
zeroc00l est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2012, 09h15   #5
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Salut a tous,

je vais essayer de simplifier ma demande.

Pour ce faire, je vais expliquer par fonction.
La premiere chose que je souhaite faire c'est lire un fichier txt... Pour ça j'ai ce petit bout de code qui marche:

Code :
1
2
3
4
5
6
7
<?php 
 $fichier="out.txt"; 
 $tabfich=file($fichier); 
 for( $i = 1 ; $i < count($tabfich) ; $i++ ){
	echo $tabfich[$i];
 }
?>
Dans ce fichier, je dois detecter un champ specialement, celui qui commence par =650:

La deja je sais pas comment faire pour dire a php de seulement ce centrer sur ce qui commence par =650 et passer du reste.

Code :
1
2
3
4
5
6
...
=500  \\$a2004.07.16
=521  0\$a3.maila
=650  \4$aDBH - Gizarte Zientziak, Geografia eta Historia$90002964=856  \\$u http://www.oup.com$z Argitaletxearen web-orria
=952  \\$p1000151$8DBH$d28/04/06$aEK$bEK$oI DBH3 GE0 24 04$eOXF$s28/04/06
...

J'essaye ça:

Code :
1
2
3
4
5
6
7
8
<?php 
 $fichier="out.txt"; 
 $tabfich=file($fichier); 
	for( $i = 1 ; $i < count($tabfich) ; $i++ ){
		if(substr($tabfich[$i],0,4)=="=650")
			echo $tabfich[$i];
	}
?>
Ça marche j'ai tous les =650 et pas le reste.

Et dans ce champ je dois recuperer tout le texte qui se trouve entre el $a et le $9

C'est a dire:

Code :
DBH - Gizarte Zientziak, Geografia eta Historia
J'essaie ceci:

Code :
1
2
3
4
5
6
7
8
9
<?php 
 $fichier="out.txt"; 
 $tabfich=file($fichier); 
	for( $i = 1 ; $i < count($tabfich) ; $i++ ){
		if(substr($tabfich[$i],0,4)=="=650")
			preg_match("(^a)", $tabfich[$i], $resultat);
	}
	echo $resultat;
?>
Et la...j'y arrive pas.
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2012, 09h50   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 250
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 250
Points : 8 635
Points : 8 635
foreach pour parcourir un tableau
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2012, 09h55   #7
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Salut
foreach... avec la boucle for ça marche pareil??

J'ai avancé depuis le post de ce matin, je suis a la phase ou j'arrive pas a isoler le string entre $a et $9...
Tu connais l'astuce pour faire ça?
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2012, 09h57   #8
Modérateur
 
Inscription : septembre 2010
Messages : 7 250
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 250
Points : 8 635
Points : 8 635
Citation:
Envoyé par ldiaz Voir le message
foreach... avec la boucle for ça marche pareil??
http://php.net/manual/fr/control-structures.foreach.php


c'est la base de PHP
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2012, 10h21   #9
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Ok alors selon le web que tu m'envoie j'ai changé le code a ceci:

Code :
1
2
3
4
5
6
7
8
<?php 
 $fichier="out.txt"; 
 $tabfich=file($fichier); 
 foreach ($tabfich as &$value) {
	if(substr($value,0,4)=="=650")
		echo $value;
	}
?>
J'ai la liste des =650 ça c'est bien, maintenant il faut que j'isole le string compris entre le $a et le $9...
La je bloque.

Voici un output:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
=650  \4$a Euskal poesia$x-Historia eta kritika$90002839
=650  \4$aEuskara$j-Ordenagailu jokoak$90002944
=650  \4$aEuskara$j-Ordenagailu jokoak$90002944
=650  \4$a Matematika$j-Ordenagailu jokoak$90002940
=650  14$aTeknologia$j-Ordenagailu jokoak$90002946
=650  14$aNatur Zientziak$j-Ordenagailu jokoak$90002935
=650  \4$aLMH - Natura, Gizarte eta Kultura Ingurunearen Ezaguera$j-Ordenagailu programak$90003035
=650  14$aOrdenagailu jokoak$90002939
=650  \4$aGeografia$j-Ordenagailu jokoak$90002941
=650  \4$aEuskara$x-Programazioa$j-Ordenagailu programak$90002960
=650  \1$aIkastetxeen kudeaketa$x-Ordutegiak$j-Ordenagailu programak$90002978
=650  \1$aIkasteknikak$j-Ordenagailu programak$90002958
=650  \1$aLogopedia$j-Ordenagailu programak$90004827
=650  \4$aOsasun hezkuntza$x-Drogak$90002874
=650  \1$aOsasun hezkuntza$x-Drogak$90002874
=650  \4$aGizarte-komunikazioa$90001462
=650  14$aOsasun hezkuntza$x-Drogak$90002874
=650  14$aOsasun hezkuntza$x-Drogak$90002874
=650  \4$aKirolak$x-Dopatzea$90007344
=650  \4$aLan giroko harremanak$90001557
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2012, 10h41   #10
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
J'essaie ceci mais ça donne erreur:

Code :
1
2
3
4
5
6
7
8
9
<?php 
 $fichier="out.txt"; 
 $tabfich=file($fichier); 
 foreach ($tabfich as &$value) {
	if(substr($value,0,4)=="=650")
		ereg("(^\$a)",$value,$mival);
		echo $mival[1];
	}
?>
Code :
PHP Notice:  Undefined variable: mival in C:\test.php on line 7
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2012, 11h35   #11
Modérateur
 
Inscription : septembre 2010
Messages : 7 250
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 250
Points : 8 635
Points : 8 635
on utilise preg pas ereg, je vais regarder ton truc cette aprem
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2012, 11h36   #12
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Je tatone la,

j'ai reussi a isoler presque 100% bien la chaine:
avec ceci
J'utilise juste une ligne dans $data au lieu de parcourir tout le fichier, pour tester:

Code :
1
2
3
4
5
6
7
8
9
<?php 
 $fichier="out.txt"; 
 $tabfich=file($fichier); 
 
 $data="=650  14\aTeknologia\j-Ordenagailu jokoak\90002946";
 $mival=strstr($data,"\9",true);
 $mival1= strstr($mival,"\a",false);
 echo $mival1;
?>

J'obtient ceci:

Code :
\aTeknologia\j-Ordenagailu jokoak
Premiere observation, j'ai dû remplacer les $ dans la chaine car php me disait: variable $a non definie.
Donc pas de soucis, je peux changer le fichier source ou faire un replace.
Ensuite reste a enlever les 2 premiers caracteres de la chaine le "\a"
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2012, 12h05   #13
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
J'arrive a faire presque ce que je voulais faire grace a ceci:
d'abord je fais un sed pour changer le $a et $9 pour chaque =650
car php pense que c'est une variable:

Code :
1
2
sed '/=650/s/\$9/||9/' out1.txt >out.txt
sed '/=650/s/\$a/||a/' out.txt >out1.txt
Ensuite, ce code affiche les strings...mais avec les ||a et ||9
Je voudrais maintenant avoir les meme strings mais sans les ||a et ||9

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php 
 $fichier="out.txt"; 
 $tabfich=file($fichier); 
 
  foreach ($tabfich as &$value) {
	if(substr($value,0,4)=="=650"){
		$mival=strstr($value,"||9",true);
		$mival1= strstr($mival,"||a",false);
		echo $mival1."<p>";
	}
 }
 
?>
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2012, 13h27   #14
Modérateur
 
Inscription : septembre 2010
Messages : 7 250
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 250
Points : 8 635
Points : 8 635
j'ai relu ton premier poste

d’où sort : 90004537 ?
d'où sorte les fichiers ?
quelle est le format final que tu souhaites avoir ?
c'est toujours 650 ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2012, 13h39   #15
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
En fait y'a 2 fichiers et je dois combiner les 2.

C'est a dire ajouter un ID dans le fichier 2 a partir d'un ID qui se trouve dans le fichier 1.

D'ou le premier pas qui consiste a isoler la chaine commune des 2 fichiers:
avec mon petit script:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
<?php 
 $fichier="out.txt"; 
 $tabfich=file($fichier); 
 
  foreach ($tabfich as &$value) {
	if(substr($value,0,4)=="=650"){
		$mival=strstr($value,"||9",true);
		$mival1= strstr($mival,"||a",false);
		echo $mival1."\n";
	}
 }
?>
J'arrive a generer ceci sur le fichier 1:

Code :
1
2
3
4
5
6
7
||aEuskal literatura$x-Historia eta kritika
||aEuskal literatura$x-Historia eta kritika
||aEuskal literatura$x-Historia eta kritika
||aEuskal literatura$x-Historia eta kritika
||aDBH - Euskara eta Literatura
||aDBH - Euskara eta Literatura
||aDBH - Euskara eta Literatura
A part les "||a" que je dois virer, cette chaine est exactement la même dans le fichier 2,
donc le but final est:
lire le fichier 2, (il ressemble a ça)

Code :
1
2
3
=LDR  00092nz   2200049n  4500
=150  \\$aFilosofia
=550  \\$wh$aFilosofia Analitikoa
detecter les champs =150
et trouver l'ID du fichier 1 pour toutes les valeur identiques (fichier2 =150 egale a fichier1 =650)

Par exemple, dans le fichier 1 j'ai ceci:
Code :
650  \4||aFilosofia||90000007
comme tu vois, dans le fichier 1 j'ai une egalité avec le fichier2 champs =150 et =650
il faut copier l'ID du fichier1 et le coller dans le fichier2 en ajoutant un string fix devant
resultat final:
Generer un fichier2 comme ceci:

Code :
1
2
3
4
=LDR  00092nz   2200049n  4500
=150  \\$aFilosofia
=550  \\$wh$aFilosofia Analitikoa
=034 \\$a0000007
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h07.


 
 
 
 
Partenaires

Hébergement Web