Compteur de ligne

Résolu/Fermé
BenjaminA2mains Messages postés 43 Date d'inscription dimanche 1 août 2021 Statut Membre Dernière intervention 5 février 2023 - Modifié le 3 juil. 2022 à 11:51
brucine Messages postés 14316 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 25 avril 2024 - 4 juil. 2022 à 08:32
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…

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

1 réponse

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
3 juil. 2022 à 13:14
Bonjour,
Il ne faut pas mettre de quotes....

SET /A COUNT=%COUNT% + 1

ou encore

SET /A COUNT += 1




Idem pour la première instruction
SET /A  COUNT= 1

1
brucine Messages postés 14316 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 25 avril 2024 1 813
3 juil. 2022 à 14:37
Bonjour,

Le compteur n'est pas dans la boucle.

Utiliser quelque chose du style:


SET COUNT=0
FOR /F "tokens=1 delims=" %%a IN (C:\Users\brucine\Desktop\texte1.txt) DO SET LINE=%%a & CALL :PROCESS
GOTO :EOF

:PROCESS
SET /A "COUNT=COUNT+1"
ECHO.%COUNT%>>C:\Users\brucine\Desktop\texte2.txt
ECHO.%LINE%>>C:\Users\brucine\Desktop\texte2.txt
EXIT /B
0
brucine Messages postés 14316 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 25 avril 2024 1 813 > brucine Messages postés 14316 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 25 avril 2024
3 juil. 2022 à 14:57
Bien que cela fonctionne pour plusieurs mots sur une même ligne, cela peut réserver des surprises.

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/
0
brucine Messages postés 14316 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 25 avril 2024 1 813 > brucine Messages postés 14316 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 25 avril 2024
3 juil. 2022 à 15:23
Mais les puristes le font avec la commande FIND paramétrée pour chaque retour de ligne break et épurée des caractères excédentaires qui nous retournera le fichier de sortie sous la forme:

1: blabla
2: coucou


@echo off
setlocal enabledelayedexpansion

set "source=texte1.txt"
set "dest=texte2.txt"

for /f "tokens=*" %%a in ('type "%source%" ^| find /v /n "" ^& break ^> "%source%"') do (
set "str=%%a
set "str=!str:]=: !"
set "str=!str:[=!"
>>%dest% echo(!str!
)
0
BenjaminA2mains Messages postés 43 Date d'inscription dimanche 1 août 2021 Statut Membre Dernière intervention 5 février 2023 > brucine Messages postés 14316 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 25 avril 2024
3 juil. 2022 à 15:47
Merci beaucoup brucine,
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
0
brucine Messages postés 14316 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 25 avril 2024 1 813 > BenjaminA2mains Messages postés 43 Date d'inscription dimanche 1 août 2021 Statut Membre Dernière intervention 5 février 2023
4 juil. 2022 à 08:32
Pas chez moi, en tout cas pas la première version, je n'ai pas testé les autres, peut-être un bug dans ton script que j'ai n'ai pas recopié à l'identique et qui n'est pas complet (les variables TXT ne sont pas définies), mets l'intégralité en ligne si tu ne trouves pas.

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).
0