Numéroter chaque ligne d'un fichier texte

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Kaplan
Niveau 1
Niveau 1
Messages : 10
Enregistré le : mar. 10 juin 2014 07:59
Localisation : Rennes
Status : Hors ligne

Numéroter chaque ligne d'un fichier texte

#1

Message 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
« Le remède à l'ennui, c'est la curiosité. La curiosité elle, est sans remède. »
Avatar du membre
mikell
Modérateur
Modérateur
Messages : 6049
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#2

Message 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)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11595
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#3

Message 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. ^^
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
mikell
Modérateur
Modérateur
Messages : 6049
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#4

Message 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:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Kaplan
Niveau 1
Niveau 1
Messages : 10
Enregistré le : mar. 10 juin 2014 07:59
Localisation : Rennes
Status : Hors ligne

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

#5

Message 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).
« Le remède à l'ennui, c'est la curiosité. La curiosité elle, est sans remède. »
Répondre