trouver nombre de mots par ligne dans une boucle + sql [RESOLU] - PHP - Programmation
Marsh Posté le 27-06-2013 à 16:05:17
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 ?
Marsh Posté le 27-06-2013 à 18:06:42
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.
Marsh Posté le 27-06-2013 à 21:22:18
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 ?
Marsh Posté le 27-06-2013 à 23:34:21
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.
Marsh Posté le 28-06-2013 à 12:00:04
Tada : ( c'est en principe le son de windows 95 lol )
Code :
|
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)] <-
Marsh Posté le 28-06-2013 à 12:53:52
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
Marsh Posté le 28-06-2013 à 13:39:56
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.
Marsh Posté le 28-06-2013 à 13:42:08
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.
Marsh Posté le 28-06-2013 à 15:09:16
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
Marsh Posté le 28-06-2013 à 15:27:35
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
Marsh Posté le 28-06-2013 à 16:04:53
J'ai trouvé
Code :
|
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
Marsh Posté le 28-06-2013 à 16:51:53
ma fonction "decoupage_chaine" te fait ça, puisque qu'elle te découpe ta chaîne et place tout les mots dans un tableau.
Marsh Posté le 28-06-2013 à 17:00:30
kbine a écrit : Ne fonctionne pas, erreur avec le fclose($handle); |
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 ?
Marsh Posté le 28-06-2013 à 17:23:51
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
Marsh Posté le 28-06-2013 à 17:47:44
ha bon ? Ça plante ce petit bout de code ?
Marsh Posté le 28-06-2013 à 18:09:15
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 :
|
<- je t'affiche le dernier mot de ta ligne (si bien sur le nom de la ville est sur un seul mot).
Marsh Posté le 28-06-2013 à 18:28:40
kbine a écrit : J'ai trouvé
|
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 :
|
Et la c'est juste
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
Marsh Posté le 28-06-2013 à 22:25:07
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 :
|
Marsh Posté le 29-06-2013 à 10:54:10
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 < # [ ( etc, mais il n'y a jamais d'accent dans le dernier mot (parfois un signe)
Marsh Posté le 29-06-2013 à 13:55:57
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.
|
je suis sans doute un peu bordélique dans ce code la
Marsh Posté le 30-06-2013 à 12:46:56
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
Marsh Posté le 01-07-2013 à 20:26:14
Je pense avoir un probleme avec ce que vous appeler regex
J'ai parfois ces caracteres : DCI-PG034 ou <ES>J
Evidemment les lettres peuvent changer
Marsh Posté le 02-07-2013 à 02:01:43
regex trouvé :
Code :
|
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<MS>xxxxx infoEND11
info111 info222 info333 x/x infoEND111
info1111 info2222 info3333 xxxxxx<>xxxxxx infoEND1111
info11111 info22222 info33333 xxxxxx<ES>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
Marsh Posté le 02-07-2013 à 19:59:06
"xxxxxx<MS>xxxxx" <- c'est toujours le 4 ème mots ?
Marsh Posté le 03-07-2013 à 08:45:56
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 -#
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
Marsh Posté le 03-07-2013 à 09:04:24
Le - 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 :
|
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.
Marsh Posté le 03-07-2013 à 09:57:02
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
Marsh Posté le 10-07-2013 à 14:33:44
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 :
|
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
Marsh Posté le 10-07-2013 à 17:20:32
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
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.
Marsh Posté le 10-07-2013 à 17:37:03
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
Marsh Posté le 10-07-2013 à 23:33:55
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
Marsh Posté le 11-07-2013 à 01:18:53
ç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 :
|
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
Marsh Posté le 11-07-2013 à 04:35:46
sujet clos, à force de chercher via google j'ai trouvé ceci
Code :
|
merci à ceux qui ont participé
Marsh Posté le 11-07-2013 à 07:42:03
Ta boucle n'a pas de raison d'être puisqu'on peut supprimer plusieurs entrées avec un unique delete
Code :
|
Marsh Posté le 27-06-2013 à 10:59:12
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.
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