Page 1 sur 1

Numéroter chaque ligne d'un fichier texte

Posté : dim. 15 nov. 2020 18:15
par Kaplan
Bonjour à tous,

J'essaye en vain de numéroter (avec le numéro de ligne) chaque ligne d'un fichier texte et en ajoutant ensuite un séparateur (#,#) après chaque numéro pour séparer les champs. Je ne suis pas parvenu à trouver la solution dans le forum (pour l'instant ! :( )
Le script que j'utilise est le suivant :

Code : Tout sélectionner

#include <ButtonConstants.au3>
#include <GuiConstants.au3>
#include <string.au3>
#include <File.au3>


HotKeySet("{ESC}")
$cen="Thefichier.txt"
FileOpen($cen, 0)
		$modif = FileRead($cen)
		$nbln = _FileCountLines($cen)
		Local $k = 1
		While $k <= $nbln
			$modif0 = StringRegExpReplace($modif, "(?m)^", $k & "#,#") ;remplir le début de chaque ligne avec le numéro de ligne et le séparateur #,#
			$k = $k + 1
			Sleep(10)
		WEnd
FileClose ($cen)
FileWrite("Resultat.txt", $modif0)
MsgBox (0,"Contenu",FileRead("Resultat.txt"))
Exit
Malheureusement, celui-ci me renvoie des lignes toutes numérotées de la même façon (avec le chiffre 5#,# sur toutes les lignes lorsqu'il y a 5 lignes dans le fichier d'origine).

Même si ce problème vous paraitra probablement modeste, il me bloque dans mon projet de conversion de fichiers TXT en HTML.
Par avance je vous remercie pour votre temps et votre savoir-faire qui m'ont plus d'une fois tiré d'affaire. :D

Re: Numéroter chaque ligne d'un fichier texte  

Posté : dim. 15 nov. 2020 21:16
par mikell
Pourquoi faire simple quand on peut faire compliqué :mrgreen:

L'idée : on lit les lignes dans une array, on modifie comme souhaité chaque élément de l'array, et on reconstitue le texte

#include <Array.au3>

$cen="Thefichier.txt"
$modif = FileReadToArray($cen)

For $i = 0 to UBound($modif)-1
   $modif[$i] = $i+1 & "#,#" & $modif[$i]  
Next

$result = _ArrayToString($modif, @crlf)
FileWrite("Resultat.txt", $result)
MsgBox (0,"Contenu",FileRead("Resultat.txt"))

Edit : pour le fun Image

$i = 0
$txt = StringReplace(FileRead("Thefichier.txt"), "'", "''")
$new = Execute('"' & StringRegExpReplace($txt, "(?m)^", _
         '" & Assign("i", Eval("i")+1)*Eval("i") & "#,#" & "') & '"')
MsgBox(0, "", $new)

Re: Numéroter chaque ligne d'un fichier texte

Posté : dim. 15 nov. 2020 21:20
par Tlem
Bonsoir.
Il existe de multiples solutions possible. En voici quelques unes :
Solution N°1 :
  1. - Lire le fichier dans un tableau avec _FileReadToArray.
  2. - Faire une boucle de lecture/modification de la ligne de chaque éléments du tableau pour rajouter ce que vous désirez (For Next).
  3. - Ré-écrire le fichier avec le tableau modifié grâce à la commande _FileWriteFromArray
Solution N°2 :
  1. - Lire le fichier dans une variable (Fileread).
  2. - On utilise un StringReplace ou StringRegExpReplace pour remplacer les @CRLF par un @CRLF + l'ajout de début de ligne.
  3. - Ré-écrire le fichier avec la variable (FileWrite).
Solution N°2 :
  1. - Lire le fichier dans une variable (Fileread).
  2. - Découper le fichier par ligne (StringSplit avec comme séparateur @CRLF) ce qui produira un tableau.
  3. - Faire une boucle de lecture/modification de la ligne de chaque éléments pour rajouter ce que vous désirez (For Next).
  4. - Ré-écrire le fichier avec le tableau modifié grâce à la commande _FileWriteFromArray
Solution N°4 :
  1. - Lecture ligne par ligne du fichier d'origine (FileReadLine).
  2. - Ajout des éléments en débute de ligne et stokage dans une variable ou écriture directe dans un nouveau fichier.
  3. - Une fois la lecture terminée, on écrase le contenu du fichier avec le contenu de la variable ou si on à écrit au fur et a mesure, on supprime le fichier d'origine et on renomme/déplace le fichier temporaire.


Edit : Arf grillé par Mikell lors de la rédaction du message.

Edit 2 : Je suis étonné que Mikell n'ait pas choisit la solution N°2. :mrgreen:

Edit 3 : L'avantage de la solution N°4 avec écriture en temps réel est la possibilité de traiter des fichiers de très grande taille sans risquer le problème de débordement mémoire ou autre. ^^

Re: Numéroter chaque ligne d'un fichier texte

Posté : dim. 15 nov. 2020 22:01
par mikell
Tlem a écrit : dim. 15 nov. 2020 21:20 Edit 2 : Je suis étonné que Mikell n'ait pas choisit la solution N°2. :mrgreen:
C'est parce que j'ai fait vite ... mais j'y pensais (c.f. Edit de mon post) :mrgreen:

Re: Numéroter chaque ligne d'un fichier texte

Posté : lun. 16 nov. 2020 00:24
par Kaplan
Génial !!! :D Merci beaucoup à mikell et Tlem pour la variété des solutions. Cela me donne de nouvelles pistes pour faire fonctionner mon script.
Je vais essayer toutes ces nouvelles possibilités et surtout mieux me documenter sur FileReadToArray que je ne connaissais pas.

Cela me permet surtout de continuer mon projet sans prendre de retard.
Encore merci pour votre aide super rapide et très qualitative (comme toujours).