Discussion:
concatenation
(trop ancien pour répondre)
Pascal
2007-04-06 11:27:07 UTC
Permalink
Bonjour
je ne suis pas très calé en programmation et je bute sur un problème qui me semble être d'une
simplicité extrème mais je ne trouve pas :

l'idée est la suivante

je scrute un fichier comprenant des lignes
chaque ligne est composée de mots séparés par des espaces, le nombre de mots par ligne est variable

je voudrais pour chaque ligne récupérer la première lettre de chaque mot et concatener celles-ci

comment j'ai procédé

une première boucle se charge
de récupérer la phrase
puis de faire un explode de celle-ci
puis de compter le nombre d'éléments contenu dans le tableau obtenu
une seconde boucle (a l'intérieur de la première) est censée
récupérer la première lettre de chaque éléments du tableau obtenu par l'explode
mais au lieu d'afficher toutes les lettres concaténées je n'ai que la dernière, je comprend bien
pourquoi, mais je n'arrive pas à y remédier

quelqu'un pourait me filer un coup de main ?

merci
denisb
2007-04-06 13:05:50 UTC
Permalink
Post by Pascal
je scrute un fichier comprenant des lignes
chaque ligne est composée de mots séparés par des espaces,
le nombre de mots par ligne est variable
je voudrais pour chaque ligne récupérer la première lettre
de chaque mot et concatener celles-ci
<?php

// pour les lettres accentuées
setlocale(LC_ALL, 'fr_FR');

// récupère le tableau des mots
// puis concatène la première lettre
function concatFirstLetter($ligne) {
$retour = '';
$les_mots = str_word_count($ligne, 2);
foreach ($les_mots as $le_mot) {
$retour .= $le_mot{0};
}
return $retour;
}

// affiche "pdtqch"
echo concatFirstLetter("prem's deuz troisième, quatre, cinq huit 123");

?>
--
@@@@@
E -00 comme on est very beaux dis !
' `) /
|\_ =="
Mihamina (R12y) Rakotomandimby
2007-04-06 19:48:58 UTC
Permalink
Post by denisb
<?php
[...]
function concatFirstLetter($ligne) {
[...]
$les_mots = str_word_count($ligne, 2);
[...]
foreach ($les_mots as $le_mot) {
[...]
$retour .= $le_mot{0};
[...]
?>
On est d'accord que je ne "critique" pas ta proposition, mais y a t il une
raison pour laquelle l'utilisation des expressions ait-été "exclu"?
On avait le charactere délimiteur de champ (espace), et on voulait la
premiere lettre de chaque champ.
denisb
2007-04-06 23:38:22 UTC
Permalink
Post by Mihamina (R12y) Rakotomandimby
Post by denisb
function concatFirstLetter($ligne) {
On est d'accord que je ne "critique" pas ta proposition, mais y a t il une
raison pour laquelle l'utilisation des expressions ait-été "exclu"?
mmhh...
non non. il n'y a pas de raison particulière.
piqué de curiosité, j'ai fait quelques tests...


1) sur la vitesse de traitement :

sur un fichier test de 17943 lignes.
ici : <http://www.circaete.net/test_php/fichier_test.txt>
(1 182 985 octets)

sur un de mes serveurs
avec les preg, je tourne entre 0,7 et 0,8 secondes pour le traitement.
avec str_word_count, je tourne entre 0,8 et 1,1 secondes.

sur un autre serveur, par contre,
avec les preg, je tourne entre 0,55 et 0,56 secondes
et avec str_word_count, entre 0,43 et 0,45 secondes...
(sans doute une question de configuration serveur/version php)


2) sur la qualité des sorties :

il faut modifier la regexp pour qu'elle ne prenne en compte que
les lettres (y compris accentuées) et pas les ponctuations ou autres.

par exemple les lignes du fichier de test :
01: 13011966
02: (R)OM - Gheorghe Gheorghiu (1991, nb) Bernard Sobel pendant
les répétitions de «Le seigneur Guan va au banquet». CDN
de Gennevilliers.
03: ¿ hauteur d'homme
04: «A.K.A» en concert

donnent avec preg :
01: 1
02: (-GG(nBSplrd«sGvabCdG
03: ¿hd
04: «ec

et avec str_word_count :
01:
02: ROGGnBSplrdLsGvabCdG
03: hd
04: AKAec


3) voici les scripts utilisés pour les tests :

concat_1.php
<?php
function get_microtime() {
list($tps_usec, $tps_sec) = explode( " ",microtime() );
return ( (float)$tps_usec + (float)$tps_sec );
}
$tps_start = get_microtime();
$buffer = file("fichier_test.txt");
$initiales = preg_replace("/([^ \n])[^ \n]* */", "$1", $buffer);
foreach($initiales as $lign) {
echo $lign."\n";
}
$tps_end = get_microtime();
$tps = $tps_end - $tps_start;
echo $tps;
?>

concat_2.php
<?php
function get_microtime() {
list($tps_usec, $tps_sec) = explode( " ",microtime() );
return ( (float)$tps_usec + (float)$tps_sec );
}
$tps_start = get_microtime();
setlocale(LC_ALL, 'fr_FR');
function concatFirstLetter($ligne) {
$retour = '';
$les_mots = str_word_count($ligne, 2);
foreach ($les_mots as $le_mot) {
$retour .= $le_mot{0};
}
return $retour;
}
$buffer = file("fichier_test.txt");
foreach($buffer as $lign) {
echo concatFirstLetter($lign)."\n";
}
$tps_end = get_microtime();
$tps = $tps_end - $tps_start;
echo $tps;
?>
--
@@@@@
E -00 comme on est very beaux dis !
' `) /
|\_ =="
Olivier Miakinen
2007-04-06 15:55:34 UTC
Permalink
Post by Pascal
je scrute un fichier comprenant des lignes
chaque ligne est composée de mots séparés par des espaces, le nombre de mots par ligne est variable
je voudrais pour chaque ligne récupérer la première lettre de chaque mot et concatener celles-ci
Tu peux le faire ligne par ligne :
$initiales_d_une_ligne = preg_replace("/([^ ])[^ ]* */", "$1", $ligne);

Mais tu peux aussi traiter tout le fichier (avec des \n) en une seule
passe :
$initiales = preg_replace("/([^ \n])[^ \n]* */", "$1", $fichier);


Explications :

"([^ \n])"
Un caractère qui n'est ni une espace ni une fin de ligne, le
premier de la série, est capturé par les parenthèses pour devenir
la référence $1.
"[^ \n]*"
Tous les caractères suivants (sans espace ni fin de ligne) sont
passés et ignorés.
" *"
Toutes les espaces qui suivent sont passées et ignorées.

"$1"
Contient l'initiale capturée.
Continuer la lecture sur narkive:
Loading...