Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1398 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1184517
FleXmO
Cocopain
Posté le 25-08-2005 à 18:22:11  profilanswer
 

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
mood
Publicité
Posté le 25-08-2005 à 18:22:11  profilanswer
 

n°1184559
wackevat
Posté le 25-08-2005 à 19:11:29  profilanswer
 

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.

n°1184571
FleXmO
Cocopain
Posté le 25-08-2005 à 19:24:27  profilanswer
 

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
n°1184578
wackevat
Posté le 25-08-2005 à 19:40:57  profilanswer
 

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.

n°1184581
FleXmO
Cocopain
Posté le 25-08-2005 à 19:44:11  profilanswer
 

ok alors voilà

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

n°1184589
wackevat
Posté le 25-08-2005 à 19:56:57  profilanswer
 

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

n°1184590
FleXmO
Cocopain
Posté le 25-08-2005 à 19:57:39  profilanswer
 

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
n°1184602
wackevat
Posté le 25-08-2005 à 20:09:59  profilanswer
 

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.

n°1184687
FleXmO
Cocopain
Posté le 25-08-2005 à 22:55:43  profilanswer
 

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
n°1184711
wackevat
Posté le 25-08-2005 à 23:13:18  profilanswer
 

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.

mood
Publicité
Posté le 25-08-2005 à 23:13:18  profilanswer
 

n°1184732
FleXmO
Cocopain
Posté le 25-08-2005 à 23:47:02  profilanswer
 

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
n°1184742
wackevat
Posté le 26-08-2005 à 00:14:29  profilanswer
 

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.

n°1185391
FleXmO
Cocopain
Posté le 26-08-2005 à 15:21:25  profilanswer
 

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
n°1185801
wackevat
Posté le 27-08-2005 à 09:16:01  profilanswer
 

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

n°1186223
FleXmO
Cocopain
Posté le 28-08-2005 à 11:10:17  profilanswer
 

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
n°1186225
FleXmO
Cocopain
Posté le 28-08-2005 à 11:23:33  profilanswer
 

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
n°1186236
wackevat
Posté le 28-08-2005 à 11:59:39  profilanswer
 

: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:

n°1186248
FleXmO
Cocopain
Posté le 28-08-2005 à 12:46:28  profilanswer
 

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


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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

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

 

Sujets relatifs
[VBS]comment lire un Sid?Extraction en ligne de commande de fichiers compressés.
[Java] [JMF] lire une vidéo sous forme de byte array?Besoin d'un batch
[PHP/MySQL] Connaître l'id de la ligne créée dans la base[batch] longueur d'une chaine de char
[SQLServeur] Mettre un string sur plusieurs ligne ?limiter le nb de ligne dans un datagrid
Batch FTP => création de rep[batch] Lire un fichier et extraire une ligne
Plus de sujets relatifs à : [BATCH] Lire la ligne d'au-dessus ou d'en dessous


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR