Remplacement dans un fichier texte, précisions ?

WRInaute occasionnel
Salut, chers WRInautes, la question que je me pose est la suivante:

Pour chaque utilisateur de mon site acceptant les cookies, je génère un fichier unique dans lequel j'écris touts ses referers, et toutes ses requests. Au début de ce fichier, dans la première ligne, il est écrit le nombre de clics effectués... Question, est-il possible de modifier le nombre de clics dans le fichier sans réécrire la totalité des données... Merci.
 
WRInaute passionné
Tu programmes en quel langage?
Et tes données, tu les écris en ASCII en mode ligne? Pas en binaire?
Quel est le format précis de cette première ligne?
 
WRInaute occasionnel
En fait le programme est en PHP, mais la question clairement est, est-il possible d'effectuer un preg_replace sans réécrire tout le fichier (UTF-8) . Merci
 
WRInaute passionné
Réponse rapide : non, car si par hasard la première ligne mise à jour est plus longue que précédemment, il faudra bien évidemment réécrire tout le fichier à la suite, sinon tu écraseras le début de la deuxième ligne.
ancienne
NClicks="9"
mise à jour,
NrClicks="10"
Si tu avais codé cete information en binaire (DWORD), tu aurais la même longueur, et tu pourrais mettre à jour la valeur sans problèms.
 
WRInaute accro
C'est une bonne question, et techniquement parlant si on considère qu'un fichier sur disque est un ensemble ordonné via une FAT (par exemple) de blocs successifs de taille fixe, il ne me semble pas possible de faire un changement de juste quelques octets (qui peuvent par exemple engendrer un décalage de tout ce qui est derrière) sur un unique bloc du dit fichier.

Certains outil anciens que tu as peut être connu comme PC tools, permettaient de faire un changement de l'ordre de l'octet sur un secteur du disque mais concrètement l'outil réécrivait le secteur complet une fois modifié puisqu'il faisait appel a des fonctions de bas niveau du bios pour écrire (genre BiosDisk(cmd, lecteur, tête, piste, secteur, n_secteur, *tampon) en relation avec l’interruption 0x13 et dispo dans <bios.h>).

Dans ton cas, si le nombre de clic nécessite un octet pour indiquer le nombre de clic (genre <10 codé en ascii) les données textuels qui suivent seront immédiatement situées derrière, quand tu va passer a plus de 10 clics il faudra deux octets codés ascii pour représenter le chiffre, 3 si tu passe les 99 etc ... bref la portion de fichier concernée stocké sur un des cluster du disque va devoir être réécrite complètement jusqu’à la fin pour compenser le décalage.

Si tu est dans un logique d'optimisation, il est peut être bon de revoir le système d'encodage de ton fichier pour par exemple le compacter an mettant bout à bout tes informations de façon très condensées et de prévoir un système de décodage / lecture pour les visualiser. Mais dans tous les cas sauf a découvrir un truc que je connais pas (ce qui est très possible), je ne pense pas que tu puisse intervenir a un niveau aussi bas.
 
WRInaute occasionnel
J'expose a nouveau le problème, j'ai un gros fichier texte, et j'aimerai juste faire un preg_replace... c'est pas grand chose, mais si il faut tout réécrire c'est énorme...
 
WRInaute accro
michel.leonard a dit:
J'expose a nouveau le problème,...
ça ne change pas grand chose au fond du problème.
Maintenant la solution consistant a lire le fichier complet, modifier le contenu via ce que tu veux (comme un preg replace) et le réécrire ensuite au complet semble la seule possible.
 
WRInaute passionné
Mettons que ton nombre de clics soit 35.
En mode texte, ce que tu stoques dans ton fichier, c'est la chaine de caractères "35'". Cette chaine est de longueur variable, d'où le problème.

En mode binaire, ce sont les octets 0x0023 (en supposant un format WORD sur 2 octets).
Ca veut dire que de 0 à 65535, la place occupée sera toujours de deux octets.
Donc tu peux ouvrir ton fichier, te positionner sur la variable, la mettre à jour et refermer le fichier, sans aucun problème (un petit peu plus compliqué que ça en pratique mais c'est l'idée).

En mode texte, tu peux aussi t'en tirer en écrivant une chaine de caractères de longueur constante (prévoir une longueur supérieure à la chaine la plus longue, et en formattant la sortie correctement.
 
Discussions similaires
Haut