Insérer une ligne dans un fichier texte

Résolu/Fermé
bbeka Messages postés 11 Date d'inscription jeudi 12 avril 2012 Statut Membre Dernière intervention 29 mai 2012 - 16 mai 2012 à 12:55
bbeka Messages postés 11 Date d'inscription jeudi 12 avril 2012 Statut Membre Dernière intervention 29 mai 2012 - 18 mai 2012 à 10:52
Bonjour,

Voilà ce que mon programme doit faire :

1) Ouvrir un fichier texte externe.
1-bis) Copier ou dupliquer le fichier si besoin.
2) Insérer une nouvelle ligne entre la première et la deuxième ligne, sans modifier la structure du texte.
3) Fermer le fichier

Voilà une partie de mon fichier texte à modifier
V5.0******************************** COMMON DATA *******************************Modification date :  09/05/2012
THERMOPHYSICAL PROPERTIES OF THE METAL *****************************************
dynamic viscosity of the liquid (kg/m/s) ..................|+1.00000E+00|visc
density (kg/m3) ...........................................|+1.00000E+00|ro
total volumic coefficient in the mushy zone (/K)...........|+1.00000E+00|betatot
number of points defining the curve beta=f(T) .............|    2       |nbetas
for each point, temperature (°C)...........................|+1.00000E+00|tem(k)
                linear thermal expansion coefficient (/K)..|+1.00000E+00|betas(k)
for each point, temperature (°C)...........................|+1.00000E+00|tem(k)
                linear thermal expansion coefficient (/K)..|+1.00000E+00|betas(k)
molecular weight of the metal (kg/mol) ....................|+1.00000E+00|asmol
specific heat (J/kg/K) ....................................|+1.00000E+00|cp
volumic thermal expansion coefficient of the liquid (/K)...|+1.00000E+00|beta
number of points defining the curve lambda=f(T) ...........|    2       |nlambda
[...]


La contrainte est que je ne dois pas faire du copier/coller ligne par ligne, vu le nombre de fichier à traiter et le nombre de lignes de chaque fichier, on perd du temps avec cette méthode.

Hormis la méthode du copier/coller ligne par ligne que je peux faire dans C, C++, Windev, JAVA ... je ne connais pas d'autres solutions, et je dois en trouver ou être sûr qu'il y en a pas.

Le choix du langage de programmation importe peu, alors si vous avez une idée sur ça, je suis preneur.

Je vous remercie de vos réponses et je m'excuse si je ne suis pas clair dans mon message alors n'hésitez pas à me demander des infos en plus.




16 réponses

heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 130
17 mai 2012 à 19:37
Pour manipuler des fichiers avec des programmes, il faut déjà bien comprendre ce qu'est physiquement un fichier, c'est à dire ce qu'est un fichier en mémoire (en RAM, sur disque dur, sur clé USB, etc)
Au niveau le plus proche du matériel, physiquement, un fichier c'est une suite de bits, une succession ininterrompue et monotone de signaux physiquement inscrits sur un support, mais qu'il n'y a rien qui corresponde physiquement à une ligne.

Ensuite à un niveau un peu au dessus matériel, il y a l'organisation conventionnelle de ces bits. Ils ne sont pas organisés de façon quelconque mais sous forme de bytes, c'est à dire d'unité adressables en mémoire.

A un niveau encore un peu au dessus, il y a la signification conventionnellement accordée à chacune des valeurs inscrites (sous forme de bits) dans les bytes.
Quand il s'agit de fichier dit texte, les valeurs des bytes codent en fait pour deux types de significations: certaines valeurs de byte codent pour des caractères, c'est à dire qu'un moteur de rendu d'affichage interprétera les bytes-caractères pour en déduire quels sortes de glyphes afficher à l'écran;
tandis que les bytes non-caractères ont d'autres significations et servent à exprimer des besoins différents de ceux de l'affichage de glyphes. Ainsi, en ASCII toutes les valeurs de bytes comprises entre 0 et 31 codent pour autre chose que des caractères.

Parmi les bytes non-caractères, il y a ceux qui ont pour rôle de signaler au moteur de rendu d'affichage qu'il faut passer à la ligne suivante: ce sont la valeur de byte symbolisée par \r et la valeur de byte symbolisée par \n.
On les représente avec un antislash parce qu'on est bien obligé de trouver un moyen de représenter par des caractères des valeurs de bytes qui ne codent pas pour des caractères.

Sous Windows, le codage des fins de lignes se fait par le groupe des deux codes \r\n accolés.




Tout ce laüs est destiné à faire comprendre qu'en ayant la notion qu'un fichier est une succession de bytes et que des lignes sont seulement un effet visuel obtenu à l'écran lors de l'affichage du fait de la présence de certaines valeurs de bytes rencontrées dans cette succession, on est plus à même d'imaginer tout seul comment on va pouvoir obtenir telle ou telle manipulation de fichier, sans devoir faire appel à d'autres personnes.

Dans ton cas, tu veux insérer quelque chose entre la première ligne et le reste des lignes. Ça, c'est la représentation intellectuelle de ce qui est voulu.
Au niveau physique, on est obligé de prendre conscience qu'on ne va pas pouvoir écarter les bits qui constituent la représentation de la première ligne et les bits qui constituent les lignes suivantes et y déposer des bits représentant l'ajout qu'on veut faire.
On va être obligé de lire et de réécrire des bytes, soit en décalant des valeurs sur des bytes proches et d'une façon qu'on va contrôler soi-même, soit on réécrit l'entièreté d'un fichier modifié et c'est le système d'exploitation qui se charge de savoir comment le faire et où mettre le nouveau fichier.

Dans le fichier initial, les bytes qui représentent la première ligne et ceux qui représentent les lignes suivantes sont séparés par le couple de bytes de valeurs \r\n.
Le point clé que je voulais ammener, c'est qu'il est plus pratique de se représenter que la première ligne est constituée de la succession de bytes jusqu'au premier couple \r\n rencontré et que les autres lignes sont la succession de bytes qui se trouvent au delà sans se préoccuper d'y distinguer des lignes.







Maintenant, au niveau de l'outil qui va permettre de faire un traitement donné sur un fichier, il est certain qu'il ne faut pas choisir d'utiliser le langage assembleur et de vouloir intervenir au niveau le plus bas, c'est à dire des bits. Ce serait monumentalement douloureux et long.
C'est pour s'affranchir de cette pénibilité qu'ont été inventés des langages d'un niveau un peu au dessus, par exemple le C.
Mais même le C est encore trop proche de la machine pour permettre de faire ce qu'on veut avec aisance. Il faut choisir un outil plus proche de l'esprit humain que le C.
Excel n'est pas un bon choix. On est contraint de l'utiliser de la manière pour laquelle il a été prévu, on ne peut pas le plier à des besoins spécifiques. Tout simplement, ce n'est pas un langage de programmation, c'est un langage de macros, pas conçu pour permettre des choses complexes.

Il faut un langage de programmation qui donne la possibilité de concrétiser en un logiciel les idées qu'on peut avoir pour obtenir tel ou tel traitement sur un fichier, compte tenu de la compréhension qu'on a de ce fichier, et sans s'enquiquiner à devoir gérer des choses au niveau matériel comme le fait le C.

Personnellement, pour cela, j'utilise Python, qui est un langage de haut niveau, c'est à dire dont l'utilisation ne nécessite pas de se préoccuper de caractéristiques liées à la machine et de la gestion des bytes.


Pour réécrire un fichier avec insertion d'un ajout entre la première ligne et le reste du fichier, il suffit en Python de faire:
chemin_de_fichier = 'C:\\Exos Python\\metallica.txt'

with open(chemin_de_fichier,'r') as fr:
    ch = fr.read()

# p = position du premier couple d'octets de valeurs \r\n
# p+2 est la position du premier octet juste après le couple \r\n
p = ch.find('\r\n') + 2

with open(chemin_de_fichier,'w') as fw:
    fw.write(ch[0:p])
    fw.write(ajout)
    fw.write(ch[p:])


Ce n'est pas la seule façon de faire mais celle-ci suffit à montrer qu'il est très simple de rédiger un programme pour faire ce que tu veux, et qu'il est très simple de le comprendre.

Tandis qu'avec Excel, il faut concevoir une macro et ça n'a pas l'air d'enthousiasmer grand monde de la faire.
Quant à sed, c'est peut être bien pour faire quelque chose de limité mais ça n'a pas l'aptitude d'être adapté pour étendre à des besoins plus complexes.

A partir du code ci-dessus , il est facile d'étendre les opérations pour obtenir un traitement automatisé de tout un réperoire, ou de tenir compte de certains critères pour différencier les actions sur des fichiers différents.

Python s'installe en moins de 10 minutes sur un ordinateur.
4