Lire la ligne d'au-dessus ou d'en dessous [BATCH] - Shell/Batch - Programmation
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.
Marsh Posté le 25-08-2005 à 19:24:27
merci de ta réponse rapide
mais comment effectuer la lecture de la ligne suivante séparément de la ligne précédente?
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.
Marsh Posté le 25-08-2005 à 19:44:11
ok alors voilà
Code :
|
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 ?
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?
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.
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?
ebut
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
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.
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é
*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é ):
Code :
|
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 !
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.
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
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 :
|
A toi de jouer pour récupérer la ligne après X
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 :
|
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 :
|
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?
Marsh Posté le 28-08-2005 à 11:59:39
Pour rajouter une ligne au début d'un fichier, tu peux faire appel à un fichier temporaire :
Code :
|
Sinon, ma version du problème de départ :
Code :
|
A prochaine
Marsh Posté le 28-08-2005 à 12:46:28
encore merci nglechau ^^ ça marche nickel
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
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
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