par
Ripat » 26 févr. 2005, 18:34
Bonjour et bienvenue!
La manip des pointeurs me donne le tourni.
Alors, voici une solution différente qui utilise la fonction file() pour stocker ton fichier dans un tableau, éclater ce tableau sur '|' et rechercher la valeur cible.
// initialisation variables
$tab = file('test.txt');
$tel = 'n22i';
$string = null;
aff_tab($tab);
// construction du tableau
foreach ($tab as $v) $tab_explode[] = explode('|', $v);
// recherche de $tel et incrémentation. Reconstruction du fichier.
foreach ($tab_explode as $k=>$v){
if ($v[0] == $tel){
$tab_explode[$k][1] = ($tab_explode[$k][1]+ 1)."\n";
}
$string .= $tab_explode[$k][0].'|'.$tab_explode[$k][1];
}
// Ecriture du nouveau contenu
$fd = fopen('test.txt', 'w+');
fwrite($fd, $string);
fclose($fd);
Autre solution, plus courte, par regex. Contrairement aux idées reçues et au risque de me faire incendier, cette solution est souvent plus rapide pour faire une recherche sur de gros fichiers plats (je teste et je poste les résultats bientôt):
$txt = file_get_contents('test2.txt');
$motif = '#^('.$tel.'\|)(\d+)#me';
$string = preg_replace($motif, "'$1'.('$2'+1)", $txt);
// Ecriture du nouveau contenu
$fd = fopen('test2.txt', 'w+');
fwrite($fd, $string);
fclose($fd);
L'idéal, bien sûr, est d'utiliser MySql, mais j'imagine que si tu poses la question, c'est que tu ne veux ou ne peux pas y accéder...
Edit
Résultats du mini bench (fichier de 10.000 lignes):
0.097 sec. avec les fonctions file() et explode()
0.003 sec. avec regex
Bonjour et bienvenue!
La manip des pointeurs me donne le tourni.
Alors, voici une solution différente qui utilise la fonction file() pour stocker ton fichier dans un tableau, éclater ce tableau sur '|' et rechercher la valeur cible.
[php]// initialisation variables
$tab = file('test.txt');
$tel = 'n22i';
$string = null;
aff_tab($tab);
// construction du tableau
foreach ($tab as $v) $tab_explode[] = explode('|', $v);
// recherche de $tel et incrémentation. Reconstruction du fichier.
foreach ($tab_explode as $k=>$v){
if ($v[0] == $tel){
$tab_explode[$k][1] = ($tab_explode[$k][1]+ 1)."\n";
}
$string .= $tab_explode[$k][0].'|'.$tab_explode[$k][1];
}
// Ecriture du nouveau contenu
$fd = fopen('test.txt', 'w+');
fwrite($fd, $string);
fclose($fd);[/php]
Autre solution, plus courte, par regex. Contrairement aux idées reçues et au risque de me faire incendier, cette solution est souvent plus rapide pour faire une recherche sur de gros fichiers plats (je teste et je poste les résultats bientôt):
[php]$txt = file_get_contents('test2.txt');
$motif = '#^('.$tel.'\|)(\d+)#me';
$string = preg_replace($motif, "'$1'.('$2'+1)", $txt);
// Ecriture du nouveau contenu
$fd = fopen('test2.txt', 'w+');
fwrite($fd, $string);
fclose($fd);
[/php]
L'idéal, bien sûr, est d'utiliser MySql, mais j'imagine que si tu poses la question, c'est que tu ne veux ou ne peux pas y accéder...
[b]Edit[/b]
Résultats du mini bench (fichier de 10.000 lignes):
[quote]0.097 sec. avec les fonctions file() et explode()
0.003 sec. avec regex[/quote]