[BATCH] Lire la ligne d'au-dessus ou d'en dessous

Lire la ligne d'au-dessus ou d'en dessous [BATCH] - Shell/Batch - Programmation

Marsh Posté le 25-08-2005 à 18:22:11    

bonjour à tous, j'aurais besoin d'un coup de main pr résoudre un pb en batch étant donné que je suis noob en programmation  :ange:  
voilà ce que je voudrais faire, j'ai un fichier texte dans lequel je voudrais prélever des informations et méthodiquement
il faudrait que le batch lise les lignes une par une et dès qu'il trouve mon info, il me copie la ligne d'au dessus dans un fichier texte
 
j'avais essayé comme ça

Code :
  1. for /f %%i in (pouet.txt) do if %%i==lala echo %%i-1 >> pouet2.txt


 
mais la boucle for n'a pas l'air de gérer les lignes comme ça, auriez vous une solution?
merci par avance


Message édité par FleXmO le 25-08-2005 à 18:22:38
Reply

Marsh Posté le 25-08-2005 à 18:22:11   

Reply

Marsh Posté le 25-08-2005 à 19:11:29    

Bonsoir,
 
A chaque fois que tu lis une ligne, garde-la dans une variable x. Puis quand tu lis la suivante, si celle-ci répond aux critères de comparaison, alors tu récupères la valeur de x.
 
Fais
for /?
à l'invite de commande pour comprendre la signification de i dans ton exemple. Ce n'est absolument pas le numéro de la ligne.

Reply

Marsh Posté le 25-08-2005 à 19:24:27    

merci de ta réponse rapide  :jap:  
mais comment effectuer la lecture de la ligne suivante séparément de la ligne précédente?


Message édité par FleXmO le 25-08-2005 à 19:24:50
Reply

Marsh Posté le 25-08-2005 à 19:40:57    

Alors on va procéder par étape.
 
Il faut d'abord que tu réussisses à afficher ton fichier ligne par ligne ;)
 
Corrige ton script pour le faire et on verra ensemble après.

Reply

Marsh Posté le 25-08-2005 à 19:44:11    

ok alors voilà

Code :
  1. for /f %%i in (pouet.txt) do echo %%i

Reply

Marsh Posté le 25-08-2005 à 19:56:57    

Chaque ligne de ton fichier d'entrée ne contient pas d'espaces ni de tabulations je suppose ?

Reply

Marsh Posté le 25-08-2005 à 19:57:39    

si en fait, et c'est là que je rencontre un 2eme pb, la fonction if ne gère pas les espaces?
en fait il faudrait que je puisse lire les lignes correspondant au schéma  
a[espace]b
 
dans ce cas il faudrait que j'utilise le for avec %%i et %%j ainsi qu'avec delims non?


Message édité par FleXmO le 25-08-2005 à 20:03:57
Reply

Marsh Posté le 25-08-2005 à 20:09:59    

Tu ne peux pas faire %%i %%j parce que comme ça tu ne peux pas savoir le nombre d'espaces entre deux éléments, ni le nombre d'éléments de chaque ligne.
 
Je te propose de (re)lire l'aide de la commande for, en particulier les paragraphes concernant les délimiteurs et l'option usebackq.
 
De même pour la commande set pour les options enableExtensions et enableDelayedExpansion. La dernière option sert à récupérer la dernière ligne lue.

Reply

Marsh Posté le 25-08-2005 à 22:55:43    

je suis désolé mais j'ai bcp de mal à piger ces textes d'aide qui sont franchement indigestes mais jsuis pas bête, fo juste m'expliquer avec un vocabulaire que je comprends
de plus dans l'aide de la commande set je ne vois pas d'options enableExtensions et enableDelayedExpansion
 
concrétement quelle est la marche à suivre pour le programme?
:debut
lire la ligne
copier le contenu dans la variable x
lire la ligne suivante
comparer à A
ligne=A -> copier x
sinon -> goto debut
 
edit: j'ai trouvé pour les extensions, la commande était setlocal je vais voir ce que je peux faire avec ça


Message édité par FleXmO le 25-08-2005 à 23:12:49
Reply

Marsh Posté le 25-08-2005 à 23:13:18    

Oui c'est ça, mais comme on ne connait pas le nombre de lignes, on va les faire tourner dans une boucle for comme tu as prévu.
 
Les options de set sont dans le contenu de l'aide (et non pas au début comme la plupart des autres commandes). Elles sont à utiliser avec la commande setlocal au début du script.
 
A part ça, tu peux faire une recherche sur le forum. La lecture des fichiers sont souvent évoqués à des fins différentes.
 
Tu peux également télécharger PowerBatch qui est gratuit et inclut un tuto sympa pour débutants.

Reply

Marsh Posté le 25-08-2005 à 23:13:18   

Reply

Marsh Posté le 25-08-2005 à 23:47:02    

ok juste besoin de qq renseignements supplémentaires:
 
*comment copier la ligne en cours dans une variable qui n'est pas un fichier?
edit: en fait j'ai trouvé  :o  
 
*mettre une boucle for dans une autre permet il de lire la première ligne et de ne pas recommencer à la 1ere pourrait il marcher ?
un code comme celui ci par exemple (mais en amélioré :whistle: ):

Code :
  1. for /f "usebackq delims=" %%i in (pouet.txt) do (
  2. set %%i == x
  3. for /f "usebackq delims=" %%i in (pouet.txt) do (
  4. if /i "%%i" == "A" echo %x% >> GNa.txt
  5. ))


 
nb: ce code ne marche pas, la seule information qu'il me retourne dans le txt est: "echo is on", il ne prend pas en compte ma variable x et je n'ai pas compris le system de l'expansion retardée, ce qui introduit ma dernière question
 
*comment faire lire la variable x qui correspond à la ligne supérieure
 
encore merci pr tes réponses nglechau !


Message édité par FleXmO le 25-08-2005 à 23:50:27
Reply

Marsh Posté le 26-08-2005 à 00:14:29    

Alors quelques règles de base :)
 
- la commande set :
set nom_du_variable=valeur
x est un nom de variable
%x% est une valeur
donc ta ligne 2 n'est pas correcte.
 
- attention au maquillage :)
set a=2
n'est pas la même chose que
set a= 2
ou
set a = 2
alors ne mets pas des espaces partout comme ça pour faire joli :)
 
Pour pouvoir utiliser usebackq, n'oublie pas de mettre  
setlocal enableExtensions
au début du script, au cas où l'environnement d'exécution n'aurait pas cette option activée.
 
Et non, l'idée que tu as sur les deux boucles ne fonctionne pas comme ça. Chaque fois tu appelles :
for /f "usebackq delims=" %%i in (pouet.txt) do ()
il recommence dès le début du fichier d'entrée.
 
Voilà. Tu corriges ton script pour qu'il lise ligne par ligne, affecte cette ligne à une variable puis affiche la valeur de celle-ci. On continuera ensemble ensuite.

Reply

Marsh Posté le 26-08-2005 à 15:21:25    

ben justement, si il ne faut pas passer par une boucle for, je ne sais pas comment le faire lire ligne par ligne :??:
 
edit: j'ai trouvé comment lui faire compter le nombre de lignes dans tout le txt, je voudrais juste savoir comment lui faire lire seulement la ligne X du fichier Y.txt, j'avais pensé à la commande skip mais hélas il ne lira pas seulement la ligne qui m'intéresse


Message édité par FleXmO le 26-08-2005 à 16:36:05
Reply

Marsh Posté le 27-08-2005 à 09:16:01    

Non, je n'ai pas dit qu'il ne fallait pas utiliser une boucle for :)
 
Allez, un petit coup de pouce pour la ligne avant X :

Code :
  1. @echo off
  2. setlocal enableExtensions
  3. for /f "usebackq delims=" %%l in (pouet.txt) do (
  4.   if /i "%%l" == "temp3" (
  5.     goto suivant
  6.   )
  7.   set LIGNE_DESSUS=%%l
  8. )
  9. goto end
  10. :suivant
  11. if defined LIGNE_DESSUS (
  12.   echo Avant=%LIGNE_DESSUS%
  13. )
  14. :end
  15. endlocal&&goto :eof


 
A toi de jouer pour récupérer la ligne après X :D

Reply

Marsh Posté le 28-08-2005 à 11:10:17    

merci j'ai essyé et en effet il faut récupérer la ligne après x, j'ai pensé à l'option skip dans la boucle for
on pourrait pas faire un truc du genre:
 

Code :
  1. setlocal enableExtensions
  2. set /A s=0
  3. :deb
  4. for /f "usebackq skip=%s% delims=" %%l in (pouet.txt) do (
  5.   if /i "%%l" == "pouet" (
  6.     goto suivant
  7.   )
  8.   set LIGNE_DESSUS=%%l
  9. )
  10. goto end
  11. :suivant
  12. if defined LIGNE_DESSUS (
  13.   echo %LIGNE_DESSUS%>>gna.txt
  14. )
  15. :end
  16. set /A s+=1
  17. endlocal&&goto deb


Message édité par FleXmO le 28-08-2005 à 11:10:53
Reply

Marsh Posté le 28-08-2005 à 11:23:33    

bon j'ai trouvé finalement ça marche ^^ il me reste juste un pb qui est que je ne peux pas mettre le skip=0 donc je suis obligé d'introduire un saut de ligne au début de mon fichier txt voici le code final:

Code :
  1. setlocal enableExtensions
  2. set /a s=1
  3. :deb
  4. for /f "usebackq skip=%s% tokens=1* delims=" %%l in (pouet.txt) do (
  5.   if /i "%%l" == "pouet" (
  6.     goto suivant
  7.   )
  8.   set LIGNE_DESSUS=%%l
  9.   set /a s+=1
  10. )
  11. goto end
  12. :suivant
  13. if defined LIGNE_DESSUS (
  14.   echo %LIGNE_DESSUS%>>gna.txt
  15.   set /a s+=1
  16.   goto deb
  17. )
  18. :end
  19. endlocal&&goto :eof


 
merci encore nglechau de ton aide ^^ mais peut-être connais-tu le moyen de rajouter une ligne au tout début d'un fichier texte? genre une commande que je pourais mettre dans mes paramètres initiaux?


Message édité par FleXmO le 28-08-2005 à 11:25:57
Reply

Marsh Posté le 28-08-2005 à 11:59:39    

:sol:
 
Pour rajouter une ligne au début d'un fichier, tu peux faire appel à un fichier temporaire :

Code :
  1. echo.>temp.txt
  2. type pouet.txt>>temp.txt
  3. move /y temp.txt pouet.txt


 
Sinon, ma version du problème de départ :

Code :
  1. @echo off
  2. setlocal enableExtensions
  3. for /f "usebackq delims=" %%l in (pouet.txt) do (
  4.   if defined TROUVE (
  5.     set LIGNE_DESSOUS=%%l
  6.     goto suivant
  7.   )
  8.   if /i "%%l" == "pouet" (
  9.     set TROUVE=1
  10.   ) else (
  11.     set LIGNE_DESSUS=%%l
  12.   )
  13. )
  14. goto end
  15. :suivant
  16. if defined TROUVE (
  17.   if defined LIGNE_DESSUS (
  18.     echo Avant=%LIGNE_DESSUS%
  19.   )
  20.   if defined LIGNE_DESSOUS (
  21.     echo Apres=%LIGNE_DESSOUS%
  22.   )
  23. )
  24. :end
  25. endlocal&&goto :eof


A prochaine :hello:

Reply

Marsh Posté le 28-08-2005 à 12:46:28    

encore merci nglechau ^^ ça marche nickel :sol:  :bounce:


Message édité par FleXmO le 28-08-2005 à 12:49:36
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed