Problème avec la lecture d'un fichier ligne par ligne

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème avec la lecture d'un fichier ligne par ligne

par AB » 30 déc. 2008, 03:48

Il faut donc savoir quel est l'encodage du texte au départ.
Effectivement comme de plus en plus de sites sont codés en utf-8, je me dis qu'on devrait spécifier l'encodage du texte notamment pour les regex sinon on peut vite avoir de mauvaises surprises. Et les débutants qui demandent conseil pourraient aussi penser que le code peut fonctionner quelque soit le type d'encodage utilisé.
Et puis il n'y a pas que les regex. htmlentities(), strpos(), strlen(), substr() entre autres font partie du lot, sans oublier strtr() qui pose problème également en UTF-8 (dans ce cas on utilise plutôt str_replace() qui est valable quelque soit le type d'encodage utilisé).

Enfin bon j'ai pas de mal à être sensibilisé sur le sujet puisque je viens juste de faire un petit tuto sur l'encodage utf-8

par blof » 29 déc. 2008, 23:31

( J'avais zappé l'UTF-8 :oops: )
... "écran" et "ecran" seront équivalents ?
"écran" et "ecran" seront différents quelque soit l'encodage.

Il faut d'abord remplacer les caractères accentués par leurs équivalents non-accentués ( é par e, è par e, ect ... ) avant de faire le comptage.

Par exemple en ISO-8859-1, le plus simple est d'utiliser strtr() ( voir le manuel, en particulier les contributions )

En UTF-8, plutôt preg_replace() ( sauf erreur de ma part )

Il faut donc savoir quel est l'encodage du texte au départ.

par cyberlp » 29 déc. 2008, 09:33

D'accord.

J'ai 2 petites questions subsidaires :

- Avant j'utilisais eregi_replace, car majuscules/minuscules n'avaient pas d'importance. Comment retrouver l'équivalent avec la nouvelle formulation?

- Ensuite, AB, ta proposition en UTF-8 signifie-t-elle que par exemple "écran" et "ecran" seront équivalents ? Et si non, comment le signifier ? (la liste d'occurrence finale ne doit pas distinguer "écran" de "ecran")

par AB » 28 déc. 2008, 22:12

Attention toutefois, les regex ci-dessus ne fonctionneront pas correctement pour un encodage en utf-8
cf : http://www.phpwact.org/php/i18n/utf-8

Pour un encodage en utf-8 on pourrait éventuellement faire
$txt = mb_strtolower($txt,"utf-8");
preg_match_all('/[\w]+/u', $txt, $v);

par cyberlp » 28 déc. 2008, 21:50

Merci beaucoup pour ton aide.

par blof » 28 déc. 2008, 21:37

$nb_occurrences = 10;

$nb_mot = array_slice($nb_mot, 0, $nb_occurrences);

foreach($nb_mot as $mot => $occurrences)
{
	// tout ce que tu veux faire avec $mot et $occurrences
}

par cyberlp » 28 déc. 2008, 21:16

Ok merci c'est effectivement tout à fait cela que je cherche !

Et comment afficher dans ce cas le contenu de l'array ? (par exemple les 10 premières occurrences par ordre décroissan : "mot 1 : 4 occurrences, mot 2 : 3 occurrences", etc.)

par blof » 28 déc. 2008, 20:55

Que "Le petit chien mange la pomme" devienne "petit chien mange pomme".
mais si le texte est "Le petit chien mange la belle pomme"
il devient "petit chien mange bel pomme"

pour eviter ça il vaudrait mieux :
$textes = preg_replace('/\b'.chop($lexique[$i]).'\b/i', '', $textes);
Pour la 2ème question, par exemple :
<pre>
<?php
$txt = '
Il était un grand mur blanc - nu, nu, nu,
Contre le mur une échelle - haute, haute, haute,
Et, par terre, un hareng saur - sec, sec, sec.
';
// Charles Cros (Le hareng saur - extrait)

$txt = strtolower($txt);
preg_match_all('/\w+/', $txt, $v);

$nb_mot = array_count_values($v[0]);
arsort($nb_mot);
print_r($nb_mot);
?>
</pre>

On peut aussi enlever les mots à ce niveau par un unset(), par exemple : unset($nb_mot['bbb']);
( à voir )

par cyberlp » 28 déc. 2008, 19:42

Hum... j'avais pas bien compris ce que tu souhaites faire. Si maintenant j'ai bien compris tu as une liste de mots dans un fichier, et tu veux supprimer dans un texte tous les mots inclus dans ce fichier ?
Oui c'est bien cela.

Et blof a trouvé ce qui clochait :D Maintenant ça marche parfaitement avec le chop(). (merci beaucoup !!)

En ce qui concerne ma 2e question, que conseilleriez-vous ? (Je rappelle que l'idée est d'analyser le texte obtenu en virant certains mots afin d'établir des analyses d'occurrence : genre un classement des mots qui apparaissent le plus.

par AB » 28 déc. 2008, 19:33

Hum... j'avais pas bien compris ce que tu souhaites faire. Si maintenant j'ai bien compris tu as une liste de mots dans un fichier, et tu veux supprimer dans un texte tous les mots inclus dans ce fichier ?

par blof » 28 déc. 2008, 19:32

Salut,

$lexique[$i] issu d'un file() contient un "retour à la ligne" ( \r\n chez windows, \n chez linux, \r chez mac ).

Dans ton $textes il n'y a pas ces "retours à la ligne".

Je n'ai pas essayé, mais je verrais bien un :
$textes=eregi_replace(chop($lexique[$i])," ",$textes);
( il existe aussi str_ireplace() préférable à eregi_replace() )

par cyberlp » 28 déc. 2008, 19:18

L'idée en fait est de supprimer tous les articles (notamment) d'un texte.

Que "Le petit chien mange la pomme" devienne "petit chien mange pomme".

Peut-être y a-t-il une meilleure méthode ??



PS : Pour le tableau sérialisé, comment tu le constitues à partir du fichier lexique ?

par AB » 28 déc. 2008, 19:13

Ha oui je n'avais pas vu ta dernière question.

A priori, j'enregistrerais mes mots dans un tableau sérialisé plutôt que de faire un mot par ligne, c'est plus facile à manipuler.

par AB » 28 déc. 2008, 19:06

Fais un print_r($lexique) pour comprendre à quoi correspond $lexique[$i].

Par ailleurs est-tu certain qu'il est nécessaire d'utiliser eregi_replace pour supprimer un élément d'un tableau ?

par cyberlp » 28 déc. 2008, 19:00

Non, ça ne marche toujours pas.

Mais bizarrement, si je mets l'un des mots à la place de $mot, par exemple :
$textes=eregi_replace("mot"," ",$textes);
il effectue bien le remplacement.



PS : ça dépend, est-ce que Ryle = le Chevalier Blanc ? :idea: