Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1639 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [RESOLU] trouver nombre de mots par ligne dans une boucle + sql

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[RESOLU] trouver nombre de mots par ligne dans une boucle + sql

n°2195616
kbine
Posté le 27-06-2013 à 10:59:12  profilanswer
 

Bonjour
 
Je lis un fichier txt ligne par ligne
Chaque ligne contient entre 4 à 12 mots
j'ai besoin de partir du dernier mot pour mettre en variable les mots compris entre le 4eme mot de la ligne et l'avant dernier
 
J'ai 2 soucis :
- Impossible de trouver comment partir du bout de la ligne
- Lorsque j'arrive à compter les mots par ligne, j'ai un cumul au lieu d'avoir une remise à zero au debut de chaque ligne.
 

Code :
  1. <?php
  2. $fp = fopen("adresse.txt","r" );
  3. $i = 0;
  4. while (!feof($fp) && $i<=30)
  5. {
  6. $page = fgets($fp).'<br/>' . $page;
  7. $i ++;
  8. $mots = explode(" ", $page);
  9. $nbre_mots = count($mots);
  10. echo 'test '.$nbre_mots.'<br/>';
  11. }
  12. ?>


 
Ce qui me donne:
test 31
test 68
test 113
test 144
 
Si je prends un exemple :
marc Truc 23ans représentant en assurance Tours
sylvie Bidule 29ans Angouleme
laurent Machin 28ans technicien frigoriste Paris

 
Je souhaite donc déduire ce qu'il y a (ou pas) entre l'age et la ville.
 
J'ai réussi à trouver ici et là des exemples pour gérer le début de la ligne :
$_mots = preg_split('/[!,-.;?:()[ ]/', $page, -1, PREG_SPLIT_NO_EMPTY);
donc substr($_mots[2] par exemple
 
Pour le metier je pensais partir d'un éventuel "end" jusqu'au mot[2] mais je patauge.
Pouvez vous me donner une indication svp, merci


Message édité par kbine le 11-07-2013 à 04:37:26
mood
Publicité
Posté le 27-06-2013 à 10:59:12  profilanswer
 

n°2195701
zcrusher
It's time to unleash the Fury
Posté le 27-06-2013 à 16:05:17  profilanswer
 

Bonjour,  
 
Avec "str_word_count() <- ça compte le nombre de mot dans une chaîne.  
 
Exemple :  
 
<?php
    $str = "marc Truc 23ans représentant en assurance Tours";
    echo str_word_count($str);
?>
 
ça doit te retourner = 7. Ça peut aussi te retourner une chaîne de caractères :  
 
tableau avec (
    [0] => marc  
    [1] => Truc  
    [2] => 23ans
    [3] => représentant  
    [4] => en  
    [5] => assurance  
    [6] => Tours
)
 
tu pourrais pas m'envoyer un exemple de fichier texte ?


Message édité par zcrusher le 27-06-2013 à 16:10:57

---------------
Si on te demande, tu diras que nous étions ensemble en train d'écraser des boîtes aux lettres !!
n°2195712
kbine
Posté le 27-06-2013 à 18:06:42  profilanswer
 

Merci pour ta réponse.
 
En fait c'est justement cette formule qui me donne un cumul :  
7 20 26 38 51 62 68 etc
 
pour le fichier txt, reprendre ce qu'il y a en bleu dans mon 1er post.
 
je pense que le cumul est du à la boucle, au lieu de repartir à 0 quand il a trouvé 7 mots, il additionne les suivants.
 
je peux isoler les 1ers mots, mais pour une chaine de caractere au milieu sans pouvoir isoler le nombre, je n'y arrive pas.
j'ai trainé sur les wiki, les sites et forums d'aides, j'ai trouvé beaucoup d'exemples qui fonctionnent sans le while, mais aucun exemple avec.
j'ai mis une journée entiere uniquement pour comprendre comment avoir les 1ers mots mais là ça fait 2 jours complets que je bute sur le probleme.
 

n°2195732
zcrusher
It's time to unleash the Fury
Posté le 27-06-2013 à 21:22:18  profilanswer
 

Un truc tout bête sans doute, mais en passant par une fonction ?
 
Je vais te faire un petit truc et tu me diras :
 
1 - j'ouvre le fichier
2 - lire une ligne
3 - j'envoi à la fonction la ligne de texte
4 - dans la fonction,  je compte le nombre de mot, et je découpe la phrase dans un tableau qui contiendra chaque mot trouvé
5 - retour à 2
 
- et aussi tu as de gros fichier à lire ou pas ?  
- as tu des caractères à la noix comme [ ( * #  É , ou tu n'as que l'espace qui sépare tes mots ?
- et as tu toujours le même nombre de mot dans ton fichier par ligne ?


Message édité par zcrusher le 27-06-2013 à 21:34:54

---------------
Si on te demande, tu diras que nous étions ensemble en train d'écraser des boîtes aux lettres !!
n°2195748
kbine
Posté le 27-06-2013 à 23:34:21  profilanswer
 

les fichiers contiennent entre 10 à 30 lignes au max
 
oui j'ai fatalement ces satanés de caracteres mais ils sont toujours entre le 3eme et le dernier mot, la gestion se fera sans gros problemes, je ne suis pas obligé de les supprimer.
 
non, le nombre de mots change, toujours s'il y a des commentaires ou pas
 
c'est peut etre ma boucle qui n'est pas bonne, le cumul ne devrait pas se faire.

n°2195800
zcrusher
It's time to unleash the Fury
Posté le 28-06-2013 à 12:00:04  profilanswer
 

Tada : ( c'est en principe le son de windows 95 lol )  
 

Code :
  1. <?php
  2. $fp = fopen("adresse.txt","r" ); // Ouvre le fichier texte
  3. while (!feof($fp)) { // ouverture du fichier jusqu'a la fin du fichier (End of file)
  4.  $page = fgets($fp); // lire une ligne du fichier texte
  5. $page=sans_Accents($page);
  6.  echo "[".$page."] -> la ligne fait ".compter_mot(supprime_espace($page))." mots <br>";
  7.  $ta=decoupage_chaine(" ",$page);
  8.  echo "Nom ".$ta[0]." | Prenom ".$ta[1]." | age ".$ta[2]." | Ville ".$ta[compter_mot($page)-1]. "<br><br>"; // etc etc ...   
  9. }
  10. /* - Le problème que j'ai ici -> si j'ai Monsieur "gilles de la tourette" <- ça marche pas ! puis qu'ici il a un nom composé
  11.    - idem pour la ville .. si il y a Chateaneuf les Martigues <- ça marche pas !
  12.    
  13. */
  14.  fclose($fp);  /*On ferme le fichier*/
  15. function compter_mot($ligne) { // compte le nombre de mot dans la ligne
  16.     return str_word_count($ligne);
  17. }
  18. function supprime_espace($chaine) { //Supprimer les espaces en FIN de chaine et en DEBUT de chaîne
  19. $chaine = ltrim($chaine);
  20. $chaine = rtrim($chaine);
  21. return ($chaine);
  22. }
  23. function sans_Accents($chaine){
  24. return strtr($chaine,'àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ',
  25. 'aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY');
  26. }
  27. function decoupage_chaine($separation,$chaine,$limit=NULL){ // je pense que si tu as un fichier CSV (type excel) tu peux avoir autre chose qu'un espace comme un ";"
  28. $returnarray = array();
  29. $increment = 0; // départ de zéro
  30. $length = strlen($chaine); // taille de la chaine   
  31. $limit_negative=($limit < 0);
  32. for($i = 0; $i < $length;$i++){ // jusqu'a la fin de la chaine
  33.  $current = substr($chaine,$i,1); // la fonction substr retourne la partie extraite de la chaîne
  34.    if($separation == $current){
  35.    $increment++;
  36.    }
  37.    elseif($separation == "" ){ 
  38.    @$returnarray[$increment].=$current;
  39.    $increment++; 
  40.    }
  41.    else {
  42.    @$returnarray[$increment].=$current;
  43.    }
  44.  if(isset($limit) && $limit == $increment){
  45.  break;
  46.  }
  47. }
  48. if($limit_negative){
  49.  for($i = 0; $i > $limit;$i--){
  50.     array_pop($returnarray);
  51.  }
  52. }
  53. return $returnarray; // retourne un tableau avec dans chaque "case" un mot.   
  54. }
  55. ?>


 
Resultat :  
 
Nom marc | Prenom Truc | age 23ans  
Nom sylvie | Prenom Bidule | age 29ans  
Nom laurent | Prenom Machin | age 28ans
 
Alors : echo "Nom ".$ta[0]." | Prenom ".$ta[1]." | age ".$ta[2]." <br>"; <- ta[0] est le premier mot, ta[1] le deuxième ...  
tu peux après avec la fonction function compter_mot($ligne) afficher le dernier mot de ton tableau avec un truc type :  ta[compter_mot($page)] <-


Message édité par zcrusher le 28-06-2013 à 18:32:27

---------------
Si on te demande, tu diras que nous étions ensemble en train d'écraser des boîtes aux lettres !!
n°2195810
zcrusher
It's time to unleash the Fury
Posté le 28-06-2013 à 12:53:52  profilanswer
 

Prochaine étape : Déduire ce qu'il y a (ou pas) entre l'age et la ville. Sachant que nous avons TOUJOURS dans l'âge XXans. <- je suppose que les personnes ont TOUJOURS 2 chiffres. Cela peut sans doute être dans une autre fonction pour retrouver UNIQUEMENT l'âge dans un tableau.
 
marc
Truc
23ans
représentant en assurance  <- sauf qu'ici comment savoir qu'elle est la séparation entre "représentant en assurance" et Tours ?
Tours


Message édité par zcrusher le 28-06-2013 à 12:56:25

---------------
Si on te demande, tu diras que nous étions ensemble en train d'écraser des boîtes aux lettres !!
n°2195820
kbine
Posté le 28-06-2013 à 13:39:56  profilanswer
 

merci pour le fichier je vais tester ça se soir si je rentre assez tot.
Merci egalement pour les explications, ça va l'aider à comprendre et ce n'est pas gagné vu le niveau
 
pour la séparation, je sais que c'est entre le 4eme mot et le dernier donc un simple calcul à faire, je devrai me débrouiller.
 

n°2195821
zcrusher
It's time to unleash the Fury
Posté le 28-06-2013 à 13:42:08  profilanswer
 

oui oui... mais bon si tu as besoins,  passes par ici ;). Même si je n'ai pas vraiment compris ce format de fichier texte ou il n'y a pas de séparation entre les champs.
Je pense que tu devrais reporter ceci dans une base SQL.


Message édité par zcrusher le 28-06-2013 à 13:46:33

---------------
Si on te demande, tu diras que nous étions ensemble en train d'écraser des boîtes aux lettres !!
n°2195840
kbine
Posté le 28-06-2013 à 15:09:16  profilanswer
 

Ne fonctionne pas, erreur avec le fclose($handle);  
pas glop
 
Si je mets fclose($fp); ça rame un sacré bout de temps.
D'ailleurs je m'aperçois qu'il ne figure pas dans le script que j'ai monté, je vais tester en le rajoutant

mood
Publicité
Posté le 28-06-2013 à 15:09:16  profilanswer
 

n°2195847
kbine
Posté le 28-06-2013 à 15:27:35  profilanswer
 

en rajoutant le close fichier sur mon script, j'ai modifié un peu l'echo :
$page2 = array("$page" );  
echo    str_word_count($page2).'<br/>';    
 
ce qui me donne le chiffre 1 par ligne mais c'est toujours mieux que d'avoir un cumul.
C'est ce cumul que je ne comprends pas d'où il peut provenir

n°2195864
kbine
Posté le 28-06-2013 à 16:04:53  profilanswer
 

J'ai trouvé
 

Code :
  1. $fp = fopen("adresse.txt","r" );
  2. $i = 0;
  3. while (!feof($fp) && $i<=30)
  4. {
  5. $page = fgets($fp);
  6. $i ++;
  7. $str = "$page";
  8. echo str_word_count($page).'<br/>';
  9. }
  10. fclose($fp);


 
avec un fichier contenant :
marc Truc 23ans représentant en assurance Tours
sylvie Bidule 29ans Angouleme
laurent Machin 28ans technicien frigoriste Paris
denis Durand 20 Narbonnes
stephanie Martin 19 tech de co Bordeaux

 
donne:
8
4
6
3
6

 
mais là je ne sais plus du tout comment isoler les mots, dur dur le php

n°2195879
zcrusher
It's time to unleash the Fury
Posté le 28-06-2013 à 16:51:53  profilanswer
 

ma fonction "decoupage_chaine" te fait ça, puisque qu'elle te découpe ta chaîne et place tout les mots dans un tableau.


---------------
Si on te demande, tu diras que nous étions ensemble en train d'écraser des boîtes aux lettres !!
n°2195881
zcrusher
It's time to unleash the Fury
Posté le 28-06-2013 à 17:00:30  profilanswer
 

kbine a écrit :

Ne fonctionne pas, erreur avec le fclose($handle);  
pas glop
 
Si je mets fclose($fp); ça rame un sacré bout de temps.
D'ailleurs je m'aperçois qu'il ne figure pas dans le script que j'ai monté, je vais tester en le rajoutant


 
 
Autant pour moi, car j'ai fermé le fichier avec une autre variable -> il te fallait ça:  fclose($fp);
 
Mais as tu essayé mon bout de code ?


Message édité par zcrusher le 28-06-2013 à 18:40:31

---------------
Si on te demande, tu diras que nous étions ensemble en train d'écraser des boîtes aux lettres !!
n°2195885
kbine
Posté le 28-06-2013 à 17:23:51  profilanswer
 

oui mais la page ne s'affiche pas, firefox plante
 
je vais regarder avec decoupage_chaine, merci, c'est la galere avec les espaces, des fois la ville n'apparait pas

n°2195891
zcrusher
It's time to unleash the Fury
Posté le 28-06-2013 à 17:47:44  profilanswer
 

ha bon ? Ça plante ce petit bout de code ?


---------------
Si on te demande, tu diras que nous étions ensemble en train d'écraser des boîtes aux lettres !!
n°2195899
zcrusher
It's time to unleash the Fury
Posté le 28-06-2013 à 18:09:15  profilanswer
 

Source ici : http://yadrade.free.fr/test/adresse.zip
TEST ici -> http://yadrade.free.fr/test/
 
code corrigé ;) <- Dans ma boucle While je n'ai pas fermé la bonne accolade !  
C'est ça de taper du code source au kilomètre sans le tester :(
 
 
Petite modif :  
 

Code :
  1. Ville ".$ta[compter_mot($page)-1].

<- je t'affiche le dernier mot de ta ligne (si bien sur le nom de la ville est sur un seul mot).


Message édité par zcrusher le 28-06-2013 à 18:26:55

---------------
Si on te demande, tu diras que nous étions ensemble en train d'écraser des boîtes aux lettres !!
n°2195903
zcrusher
It's time to unleash the Fury
Posté le 28-06-2013 à 18:28:40  profilanswer
 

kbine a écrit :

J'ai trouvé
 

Code :
  1. $fp = fopen("adresse.txt","r" );
  2. $i = 0;
  3. while (!feof($fp) && $i<=30)
  4. {
  5. $page = fgets($fp);
  6. $i ++;
  7. $str = "$page";
  8. echo str_word_count($page).'<br/>';
  9. }
  10. fclose($fp);


 
avec un fichier contenant :
marc Truc 23ans représentant en assurance Tours
sylvie Bidule 29ans Angouleme
laurent Machin 28ans technicien frigoriste Paris
denis Durand 20 Narbonnes
stephanie Martin 19 tech de co Bordeaux

 
donne:
8
4
6
3
6

 
mais là je ne sais plus du tout comment isoler les mots, dur dur le php


 
Sauf que c'est une erreur car tout comme moi, tu trouves 8 mots dans la première phrase alors qu'il y en a seulement 7. Je viens de voir que l'erreur est du à l'accent de "représentant ".. je vais corrigé ça ;)
 
petite fonction en plus : $page=sans_Accents($page), elle supprime donc les accents de la chaîne avant de compter le nombre de mot.
 

Code :
  1. function sans_Accents($chaine){
  2. return strtr($chaine,'àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ',
  3. 'aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY');
  4. }


 
Et la c'est juste :D
 
Résumons nous :  
Source : adresse.txt
 
marc Truc 23ans representant en assurance Tours
sylvie Bidule 29ans Angouleme
laurent Machin 28ans technicien frigoriste Paris
denis Durand 20ans Narbonnes
stephanie Martin 19ans tech de co Bordeaux
 
Source ici : http://yadrade.free.fr/test/adresse.zip <- avec le fichier adresse
TEST ici -> http://yadrade.free.fr/test/
 
Résultat :  
 
[marc Truc 23ans representant en assurance Tours ] -> la ligne fait 7 mots  
Nom marc | Prenom Truc | age 23ans | Ville Tours  
 
[sylvie Bidule 29ans Angouleme ] -> la ligne fait 4 mots  
Nom sylvie | Prenom Bidule | age 29ans | Ville Angouleme  
 
[laurent Machin 28ans technicien frigoriste Paris ] -> la ligne fait 6 mots  
Nom laurent | Prenom Machin | age 28ans | Ville Paris  
 
[denis Durand 20ans Narbonnes ] -> la ligne fait 4 mots  
Nom denis | Prenom Durand | age 20ans | Ville Narbonnes  
 
[stephanie Martin 19ans tech de co Bordeaux] -> la ligne fait 7 mots  
Nom stephanie | Prenom Martin | age 19ans | Ville Bordeaux


Message édité par zcrusher le 28-06-2013 à 21:42:04

---------------
Si on te demande, tu diras que nous étions ensemble en train d'écraser des boîtes aux lettres !!
n°2195930
bistouille
Posté le 28-06-2013 à 22:25:07  profilanswer
 

J'ai zieuter ton code, y'a beaucoup de truc inutiles, str_word_count accepte des caractères additionnels en 3ème paramètre, ce qui résout facilement ton problème d'accents.
 
Exemple vite fait.
 

Code :
  1. header('Content-type: text/plain');
  2. $donnees = file('adresse.txt');
  3. $car_add = 'àáâçèéêëîïôùûÀÁÂÇÈÉÊËÎÏÔÙÛ0123456789';
  4. foreach( $donnees as $ligne )
  5. {
  6.     $nb_mots = str_word_count($ligne, 0, $car_add);
  7.     $mots = str_word_count($ligne, 1, $car_add);
  8.     echo 'Nom : ' . $mots[0] . ' Prénom : ' . $mots[1] . ' Âge : ' . $mots[2] . ' : Ville : ' . $mots[$nb_mots-1];
  9.     echo '  <<-- ' . "$nb_mots mots\n\n";
  10. }

n°2195951
kbine
Posté le 29-06-2013 à 10:54:10  profilanswer
 

merci de l'aide, si j'ai le temps je vois ça à midi , sinon en soirée.
 
Les accents ne sont pas trop dérangeant car j'ai juste besoin d'isoler une phrase en prenant le 3eme mot jusuq'à l'avant dernier.
 
Dans cette phrase de plusieurs mots, (ou d'aucun, il peut ne pas y avoir de commentaires ou juste des espaces), je trouve des &lt; # [ ( etc, mais il n'y a jamais d'accent dans le dernier mot (parfois un signe)

n°2195967
zcrusher
It's time to unleash the Fury
Posté le 29-06-2013 à 13:55:57  profilanswer
 

bistouille a écrit :

J'ai zieuter ton code, y'a beaucoup de truc inutiles, str_word_count accepte des caractères additionnels en 3ème paramètre, ce qui résout facilement ton problème d'accents.
 
Exemple vite fait.
 

Code :
  1. header('Content-type: text/plain');
  2. $donnees = file('adresse.txt');
  3. $car_add = 'àáâçèéêëîïôùûÀÁÂÇÈÉÊËÎÏÔÙÛ0123456789';
  4. foreach( $donnees as $ligne )
  5. {
  6.     $nb_mots = str_word_count($ligne, 0, $car_add);
  7.     $mots = str_word_count($ligne, 1, $car_add);
  8.     echo 'Nom : ' . $mots[0] . ' Prénom : ' . $mots[1] . ' Âge : ' . $mots[2] . ' : Ville : ' . $mots[$nb_mots-1];
  9.     echo '  <<-- ' . "$nb_mots mots\n\n";
  10. }



 
 
 :jap: je suis sans doute un peu bordélique dans ce code la ;)


---------------
Si on te demande, tu diras que nous étions ensemble en train d'écraser des boîtes aux lettres !!
n°2196033
kbine
Posté le 30-06-2013 à 12:46:56  profilanswer
 

Le fichier marche impec, mais pas avec celui d'origine.
Je pense que c'est à cause des espaces ou des signes.
Je vois ça à mon retour et je vous dis le probleme, merci

n°2196186
kbine
Posté le 01-07-2013 à 20:26:14  profilanswer
 

Je pense avoir un probleme avec ce que vous appeler regex
 
J'ai parfois ces caracteres : DCI&#45;PG034 ou &lt;ES&gt;J
 
Evidemment les lettres peuvent changer
 

n°2196200
kbine
Posté le 02-07-2013 à 02:01:43  profilanswer
 

regex trouvé :

Code :
  1. $pattern=array();
  2. $replace=array();
  3. $pattern[0]="/&lt;lang (class=[A-Za-z='\":]*) ?&gt;/";
  4. $replace[0]="<pre $1>";
  5. $pattern[1]="/&lt;\/lang&gt;/";
  6. $replace[1]="</pre>";
  7. //
  8. preg_replace($pattern, $replace,$page);


 
mais je suis bloqué sur le nombre de mots car je ne trouve pas le bon nombre d'une ligne à l'autre, et le dernier mot affiche un vide
 
Voici 5 lignes du fichier d'origine (mots codés par sécurité), le texte n'est pas encore passé au regex
info1        info2  info3                                 infoEND1    
info11       info22  info33 xxxxxx&lt;MS&gt;xxxxx                       infoEND11    
info111        info222  info333 x/x                            infoEND111      
info1111      info2222  info3333 xxxxxx&lt;&gt;xxxxxx                  infoEND1111    
info11111       info22222  info33333 xxxxxx&lt;ES&gt;xxxxxx 001            infoEND11111    
 
En bleu la partie commentaire, qui est parfois vide (d'où l'interet d'avoir en valeur le dernier mot (infoEND)
Les espaces sont copiés tels que présent sur le fichier (sauf pour le code couleur bleu que j'ai rajouté pour une meilleure compréhension
Je peux me permettre de supprimer les accents mais pas les signes
Quelle que soit la méthode utilisée, je ne trouve jamais pareil
Le regex résout bien le probleme des signes, mais pas du comptage
 

n°2196301
zcrusher
It's time to unleash the Fury
Posté le 02-07-2013 à 19:59:06  profilanswer
 

"xxxxxx&lt;MS&gt;xxxxx" <- c'est toujours le 4 ème mots ?


---------------
Si on te demande, tu diras que nous étions ensemble en train d'écraser des boîtes aux lettres !!
n°2196336
kbine
Posté le 03-07-2013 à 08:45:56  profilanswer
 

oui, à partir du 4eme mot jusqu'à l'avant dernier.
 
il peut y avoir parfois un / dans le 1er mot
 
il a a toujours un point dans le 3eme
 
le dernier mot contient parfois un &#45;#  
 
avec tout ce que j'ai pu lire, je pense résoudre les soucis de lettres bizarres et signes, mais franchement le probleme du nombre de mot me gave au plus haut point et j'ai pris un retard monstre avec ça

n°2196337
bistouille
Posté le 03-07-2013 à 09:04:24  profilanswer
 

Le &#45; est une entité html, voir table ascii.
C'est pas une bonne idée d'enregistrer du html dans un fichier texte.
 
Je suppose que les espaces sont les séparateurs de mots du moins pour les 3 premiers, en partant de cette optique, je pense que preg_split est à utiliser.
 

Code :
  1. header('Content-type: text/plain');
  2. $donnees = file_get_contents('fichier');
  3. $donnees = trim(html_entity_decode($donnees));
  4. $donnees = preg_replace('~infoEND1+~', '', $donnees); // suppression des infoEND1 trucs bidules qui servent  juste de délimiteurs de fin si j'ai bien saisi
  5. $lignes = explode("\n", $donnees);
  6. $donneesF = array();
  7. $i = 0;
  8. foreach( $lignes as $ligne )
  9. {
  10.    $mots = preg_split('~ ~', $ligne, null,  PREG_SPLIT_NO_EMPTY);
  11.    $donneesF[$i] = '1 : ' . $mots[0] . ', 2 : ' . $mots[1] . ', 3 : ' . $mots[2];
  12.    if( ($n = count($mots)) > 3 )
  13.    {
  14.        $donneesF[$i] .= ', 4 : ';
  15.        for( $j=3; $j<$n; $j++ )
  16.            $donneesF[$i] .= ' ' . $mots[$j];
  17.    }
  18.    $i++;
  19. }
  20. print_r($donneesF);


 
Enfin, faudrait revoir à utiliser un bon délimiteur de mots dans ton fichier (caractères exigus ou chaine de caractères spécifique) afin de faciliter son exploitation.

n°2196339
kbine
Posté le 03-07-2013 à 09:57:02  profilanswer
 

Merci je viens de tester et toujours résultat aléatoire. Soit effectivement j'ai bien le dernier mot, soit j'ai un mot au milieu de la phrase ou juste une lettre. Je vais chercher une autre solution, peut etre traduire en utf8 la page qui me sert de reference, ou une idée dans ce style pour ensuite la retravailler. Je n'ai pas le choix de passer par une html pour la traduire en txt, dommage pour moi

n°2197044
kbine
Posté le 10-07-2013 à 14:33:44  profilanswer
 

Bonjour
 
Besoin d'aide à nouveau svp :
 
Je passe désormais par mysql
 
A savoir que j'enregistre mes données dans une table et je lis la table en php après.
 
1) le fichier enregistre environ 8000 lignes par jour, je cherche à faire lire uniquement les 100 dernieres enregistrées
2) le fichier enregistre environ 8000 lignes par jour, je cherche à supprimer les anciennes pour ne pas alourdir la base
 
Pour la suppression j'ai vraiment aucune piste, j'ai mis une case 'id' qui s’incrémente à chaque enregistrement mais je ne vois pas comment m'en servir
 
Pour la lecture des dernieres lignes, la boucle que j'avais trouvé précédemment ne fonctionne pas dans ce cas de figure:
 
 

Code :
  1. $sql = "SELECT * FROM maliste WHERE id >= '0'"; 
  2. $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
  3. $i = 0;
  4. while($data = mysql_fetch_array($req) && $i<=50)
  5.     { 
  6. $_f1 = $data['f1'];
  7. $_time = $data['time']; 
  8. $_nom  = $data['nom'];
  9. $_ville= $data['ville'];
  10. $_msg = $data['msg'];
  11. $i ++;
  12.  
  13.     }
  14.      
  15. ?>
  16. <font color="#009999"><b><?php echo $_nom; ?></b></font>  etc.....</font><br>
  17. <?php     
  18.      
  19. ?>


 
 
Soit je n'affiche rien comme ce cas présent, soit j'affiche uniquement la 51eme ligne
 
Ma base :
Textes complets id  f1  time  nom  ville  msg  date  txt1  txt2  txt3
 
date  txt1  txt2  txt3 ne servant pas pour l'instant.
 
Merci par avance de l'aide

n°2197094
bistouille
Posté le 10-07-2013 à 17:20:32  profilanswer
 

Pour le 1, un simple ORDER BY LIMIT DESC non ?
Pour le 2, tu peux utiliser ta colonne date comme référence, genre WHERE DATE < AAAA-MM-DD et faire périodiquement une suppression massive, attention tout de même à ce genre de manip surtout si tu fais une saisie manuelle, une erreur est vite arrivée  :whistle:  
Mais  pourquoi vouloir faire de la suppression en fait ?
 
Sinon, quel intérêt ton WHERE id >= 0 ?
sachant qu'un id est un entier positif.
 
En ce qui concerne le fait que tu affiches rien ou uniquement la 51ème ligne, forcément tu n'affiches pas les données dans ta boucle, évidemment donc tu n'afficheras que le dernier résultats.
Autre chose, il n'y a aucune intérêt à affecter tes valeurs à d'autres variables.

n°2197097
kbine
Posté le 10-07-2013 à 17:37:03  profilanswer
 

bonjour et merci du message
 
je ne connais pas ORDER BY LIMIT DESC ça sera apparemment + simple que  id >= 0 (grosso modo ça a marché, j'ai gardé, je ne savais pas comment dire pour afficher si ce n'etait pas nul)
 
je dois supprimer car il me faut juste 50 lignes à l'affichage sur le site
mais il y a environ 8000 enregistrements par jour, donc 8000 lignes jour, ce qui doit faire beaucoup à court terme pour la base je pense
 
je sais pas pourqoi j'ai repris d'autres variables, c'est con effectivement, je regle ça de suite
 
pour l'affichage j'ai réussi à comprendre que ce n'etait pas dans la boucle mais impossible d'afficher la liste en html dans la boucle, je n'ai aps encore du trouver le bon exemple mais je cherche.
Apparemment je peux utilser echo $var dans la boucle mais j'ai besoin de colorier certains mots, mettre en gras certains, et il y aura egalement un des mots qui sera sur un lien
je découvre le php et pas si simple de m'y retrouver

n°2197126
kbine
Posté le 10-07-2013 à 23:33:55  profilanswer
 

Merci bistouille, j'ai réussi la boucle et grace à ton order by limit c'est au poil.
Reste juste à trouver comment effacer les anciens enregistrements

n°2197130
kbine
Posté le 11-07-2013 à 01:18:53  profilanswer
 

ça fonctionne mais c'est bancal.
J'ai réussi à faire ma boucle pour afficher les 30 derniers enregistrement
 
Je bloque sur la 2eme boucle qui doit effacer tous les enregistrements sauf les 30 deniers:
 

Code :
  1. $sql = "SELECT * FROM maliste ORDER BY id ASC"; 
  2. $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
  3. $i = 1;
  4. while(($data = mysql_fetch_array($req)) && ($i<=$ref))
  5.     {
  6.    
  7. $Del_ID = $data['id'];   
  8. $sql1 = "DELETE FROM maliste WHERE id = '$Del_ID'";
  9. mysql_query($sql1);
  10. $i ++;   
  11. mysql_close();


 
Dans la boucle précédente, il incremente ID jusqu'à par exemple 560
560 - 30 = $ref
Donc je tente de dire dans la boucle ci dessus d'effacer tous les anciens enregistrements jusqu'à $ref
 
ça fonctionne 2 ou 3 coup et ça efface tout, je ne trouve pas pourquoi

n°2197131
kbine
Posté le 11-07-2013 à 04:35:46  profilanswer
 

sujet clos, à force de chercher via google j'ai trouvé ceci
 

Code :
  1. if ($Del_ID <= $ref) {
  2. $sql1 = "DELETE FROM maliste WHERE id = '$Del_ID'";
  3. mysql_query($sql1);
  4. $i ++;


 
merci à ceux qui ont participé

n°2197134
bistouille
Posté le 11-07-2013 à 07:42:03  profilanswer
 

Ta boucle n'a pas de raison d'être puisqu'on peut supprimer plusieurs entrées avec un unique delete ;)
 

Code :
  1. $sql = 'SELECT id FROM maliste ORDER BY id DESC LIMIT 30,1';
  2. $req = mysql_query($sql);
  3. if( ($result = mysql_fetch_assoc($req)) )
  4. {
  5.     $sql = 'DELETE FROM maliste WHERE id <= ' . $result['id'];
  6.     $req = mysql_query($sql);
  7. }


 
 

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [RESOLU] trouver nombre de mots par ligne dans une boucle + sql

 

Sujets relatifs
Faire une boucle avec un argument du tableau et définir si args=nombreAjout de ligne automatique sur excel 2010 - VBA
peties question php/mysql sur le nombre de reqStocker grand nombre d'objets / mauvaise structure de donnée ?
[VBA Excel 2003] - Problème pour récupérer la 65537° ligne d'un CVSnombre des paramètres dans une fonction
Problème de mise en ligne d un site localJoindre le nombre d'enregistrement freres
SQl : trouver l'élément suivant d'une colonne 
Plus de sujets relatifs à : [RESOLU] trouver nombre de mots par ligne dans une boucle + sql


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR