Compteur de ligne
Résolu
BenjaminA2mains
Messages postés
43
Date d'inscription
Statut
Membre
Dernière intervention
-
brucine Messages postés 21702 Date d'inscription Statut Membre Dernière intervention -
brucine Messages postés 21702 Date d'inscription Statut Membre Dernière intervention -
Bonjour, comment allez-vous ?
Comme toujours j'ai un problème à la c** XD
Voici mon problème :
J'ai un doc texte et je veux simplement compter le nombre de ligne et réécrire la ligne en question en dessous de mon compteur.
Pour cela j'utilise une boucle FOR et une variable (COUNT) auquel j'additionne à lui même "1".
Mais l'addition ne se fait pas pour autant,.. ma variable COUNT reste toujours et quoiqu'il arrive égal à "1".
Et le pire de tout ça c'est que dans mon log, la variable COUNT n'est même pas affiché… genre rien…
Merci par avance pour votre aide, car là je ne comprends pas..
P.S : Je sais que le projet parais absurde mais c'est pour m'entraîner en batch
Comme toujours j'ai un problème à la c** XD
Voici mon problème :
J'ai un doc texte et je veux simplement compter le nombre de ligne et réécrire la ligne en question en dessous de mon compteur.
Pour cela j'utilise une boucle FOR et une variable (COUNT) auquel j'additionne à lui même "1".
Mais l'addition ne se fait pas pour autant,.. ma variable COUNT reste toujours et quoiqu'il arrive égal à "1".
Et le pire de tout ça c'est que dans mon log, la variable COUNT n'est même pas affiché… genre rien…
SET /A "COUNT= 1" FOR /F "delims=; tokens=1" %%a IN (%TXT%) DO ( ECHO.%COUNT%>>%TXT2% ECHO.%%a>>%TXT2% ECHO.>>%LOG% ECHO.%time% ^| Copie %COUNT%>>%LOG% ECHO.%time% ^| Copie %%a>>%LOG% SET /A "COUNT=%COUNT% + 1" )
Merci par avance pour votre aide, car là je ne comprends pas..
P.S : Je sais que le projet parais absurde mais c'est pour m'entraîner en batch
A voir également:
- Compteur de ligne
- Compteur électrique - Guide
- Partage de photos en ligne - Guide
- Mètre en ligne - Guide
- Formulaire en ligne de meta - Guide
- Aller à la ligne excel - Guide
Le compteur n'est pas dans la boucle.
Utiliser quelque chose du style:
Il faut dans ce cas enlever le tokens qui ne sert à rien: FOR /F "delims="
L'autre manière de procéder est par delayed expansion:
https://stackhowto.com/batch-file-to-read-text-file-line-by-line-into-a-variable/
1: blabla
2: coucou
Ca fonctionne du tonnerre la stratégie de mettre le procédé en dehors de la boucle est super intéressant.
Ca me permettra d'y faire appel même sans boucle, c'est super !
Par contre il y a un truc chelou c'est qu'il copie 2 fois la fois la dernière ligne ????
Plutôt étrange. Je vais y voir à ça et si j'arrive pas, je créerai un nouveau topique XD
Merci encore :D
On oublie souvent les "subtilités" de l'itération FOR parce que, paradoxalement, elle ne nous sert parfois qu'à extraire une seule valeur, mais si on la laisse se dérouler en entier, elle remplace à chaque itération une valeur par la suivante si bien qu'elle ne rend à la fin que la dernière valeur; pour éviter ce comportement, les différentes moutures reposent toujours sur l'interception de chaque valeur, il y a 2 voies différentes:
-la sous-routine CALL dirige chaque sortie vers une étiquette de traitement (ici :PROCESS) d'où elle ressort à chaque fois par EXIT /B qui renvoie là où elle a été écrite: la conséquence en est que les traitements que l'on veut appliquer doivent être écrits dans cette étiquette :PROCESS, et non pas dans la boucle initiale.
-l'utilisation de l'expansion des variables est un peu plus subtile.
Elle n'est pas automatique et doit être appelée avant utilisation par setlocal enabledelayedexpansion (et peut être si la suite du script le nécessite être neutralisée par setlocal disabledelayedexpansion).
La "subtilité" réside dans le fait que la variable doit être définie classiquement dans l'itération dans le format batch %%:
FOR /F "delims=" %%a IN ('type "E:\tmp1.txt"') DO SET TARTEMPION=%%a
que si j'y fais appel à l'intérieur de cette boucle pour chaque valeur je dois utiliser l'expansion de la variable !TARTEMPION!:
FOR /F "tokens=1 delims= " %%g IN ('type "E:\tmp2.txt"') DO SET BIDULE=%%g
COPY "E:\Souvenirs\!TARTEMPION" "E:\Vacances\!BIDULE!\!TARTEMPION!" >nul
mais que si j'ai une bonne raison de faire appel à cette variable hors de la boucle je dois continuer à le faire via %TARTEMPION%
La syntaxe CALL est le plus souvent plus facile à écrire sans risque de confusion bien que moins "élégante".
Pour revenir à nos moutons, si ton script écrit la dernière ligne à la suite de l'ensemble correct des lignes, c'est que la sortie de l'itération est mal faite: une première via CALL ou ce qu'on voudra retourne bien l'ensemble des lignes, mais un deuxième bouclage a lieu en dehors de la sous-routine CALL et il fait son job: il ne retourne que la dernière valeur (la dernière ligne).