Batch Index du Forum
S’enregistrerRechercherFAQMembresGroupesConnexion
Répondre au sujet Page 1 sur 1
Récupérer une ligne précise d'un fichier texte
Auteur Message
Répondre en citant
Message Récupérer une ligne précise d'un fichier texte 
Bonjour,

Je suis en train de coder une petite intelligence artificielle en batch, mais j'aimerais faire un système pour pouvoir ajouter des fichiers compatibles à celle-ci, mais j'ai un petit problème :

Comment récupérer une ligne précise d'un fichier texte ?


Par exemple, j'aimerais récupérer la ligne N°7 du fichier suivant :

Code:
RIEN5
RIEN6
RIEN7
RIEN8
RIEN9
RIEN10
RIEN11
RIEN12
RIEN13


Et j'aimerais mettre la valeur dans une variable. Ici, j'aimerais par exemple que dans la variable %ligne% se trouve "RIEN11".

Pouvez-vous m'aider ?


A bientôt,

Froxil




______________________________________________________
Pourquoi faire compliqué lorsqu'on peut faire encore plus compliqué ?
Message Publicité 
PublicitéSupprimer les publicités ?


Répondre en citant
Message Re: Récupérer une ligne précise d'un fichier texte 
Froxil a écrit:
Bonjour,

Je suis en train de coder une petite intelligence artificielle en batch, mais j'aimerais faire un système pour pouvoir ajouter des fichiers compatibles à celle-ci, mais j'ai un petit problème :

Comment récupérer une ligne précise d'un fichier texte ?


Par exemple, j'aimerais récupérer la ligne N°7 du fichier suivant :

Code:
RIEN5
RIEN6
RIEN7
RIEN8
RIEN9
RIEN10
RIEN11
RIEN12
RIEN13


Et j'aimerais mettre la valeur dans une variable. Ici, j'aimerais par exemple que dans la variable %ligne% se trouve "RIEN11".

Pouvez-vous m'aider ?


A bientôt,

Froxil




Pour récupérer une ligne précise d'un fichier, il est évident qu'il faut checker toutes les lignes une à une jusqu'à arriver sur la ligne voulue Mr. Green
Le code que je te propose est très très rapide, il peut aller chercher la 25 000ème ligne de ton fichier en moins de 1s, j'utilise une petite astuce pour aller beaucoup beaucoup + plus vite Okay

Pour cela je t'ai fait une fonction batch sûr mesure rien que pour toi :
Code:
:GetLine <file> <Nb>
if "%~1"=="" pause>nul&exit
set "tmpFile=%~1"
set /a nb=%~2
set /a nbSkip=%nb%-1
( echo;for /f "skip=%nbSkip% tokens=*" %%%%l in ^('type "%tmpFile%"'^) do set "line=%%%%l"^&goto :GetLineok&echo;:GetLineok )> "%temp%\tmp_%~nx0"
call "%temp%\tmp_%~nx0"&del /q "%temp%\tmp_%~nx0"
set "line_%nb%=%line%"
goto :eof




Fred a écrit:
Mais dis donc Jamy, comment utilise donc cette fonction ?




Et bien c'est très simple, il suffit de l'appeler en lui passant en arguments les données dont elle a besoin pour fonctionner Mr. Green
Voici une utilisation simple :

Code:
@echo off

set "file=mon_fichier.txt"


call :GetLine "%file%" 5


::Affiche : RIEN9
echo;%line%


:GetLine <file> <Nb>
if "%~1"=="" pause>nul&exit
set "tmpFile=%~1"
set /a nb=%~2
set /a nbSkip=%nb%-1
( echo;for /f "skip=%nbSkip% tokens=*" %%%%l in ^('type "%tmpFile%"'^) do set "line=%%%%l"^&goto :GetLineok&echo;:GetLineok )> "%temp%\tmp_%~nx0"
call "%temp%\tmp_%~nx0"&del /q "%temp%\tmp_%~nx0"
set "line_%nb%=%line%"
goto :eof



Voici une utilisation plus avancé :
Code:
@echo off

set "file=mon_fichier.txt"


call :GetLine "%file%" 7
echo;Ligne 7 : %line%
call :GetLine "%file%" 8
echo;Ligne 8 : %line%
call :GetLine "%file%" 9
echo;Ligne 9 : %line%


::RIEN11
::RIEN12
::RIEN13




:GetLine <file> <Nb>
if "%~1"=="" pause>nul&exit
set "tmpFile=%~1"
set /a nb=%~2
set /a nbSkip=%nb%-1
( echo;for /f "skip=%nbSkip% tokens=*" %%%%l in ^('type "%tmpFile%"'^) do set "line=%%%%l"^&goto :GetLineok&echo;:GetLineok )> "%temp%\tmp_%~nx0"
call "%temp%\tmp_%~nx0"&del /q "%temp%\tmp_%~nx0"
set "line_%nb%=%line%"
goto :eof




Bon c'est bien beau tout ça mais toi tu voulais déclarer une variable et y mettre le contenu de la ligne dedans, et bien c'est très simple :

Code:
@echo off

set "file=mon_fichier.txt"
call :GetLine "%file%" 6


set ma_ligne=%line%
echo;%ma_ligne%

::RIEN10




:GetLine <file> <Nb>
if "%~1"=="" pause>nul&exit
set "tmpFile=%~1"
set /a nb=%~2
set /a nbSkip=%nb%-1
( echo;for /f "skip=%nbSkip% tokens=*" %%%%l in ^('type "%tmpFile%"'^) do set "line=%%%%l"^&goto :GetLineok&echo;:GetLineok )> "%temp%\tmp_%~nx0"
call "%temp%\tmp_%~nx0"&del /q "%temp%\tmp_%~nx0"
set "line_%nb%=%line%"
goto :eof




Ce qui est bien avec la fonction que je te propose c'est qu'elle stock toutes les lignes cherchés dans le programme
Reprenons l'exemple d'une utilisation plus avancé mais cette fois si en utilisant cette caractéristique de stockage :

Code:
@echo off

set "file=mon_fichier.txt"


call :GetLine "%file%" 7
call :GetLine "%file%" 8
call :GetLine "%file%" 9


echo;Ligne 7 : %line_7%
echo;Ligne 8 : %line_8%
echo;Ligne 9 : %line_9%


::RIEN11
::RIEN12
::RIEN13




:GetLine <file> <Nb>
if "%~1"=="" pause>nul&exit
set "tmpFile=%~1"
set /a nb=%~2
set /a nbSkip=%nb%-1
( echo;for /f "skip=%nbSkip% tokens=*" %%%%l in ^('type "%tmpFile%"'^) do set "line=%%%%l"^&goto :GetLineok&echo;:GetLineok )> "%temp%\tmp_%~nx0"
call "%temp%\tmp_%~nx0"&del /q "%temp%\tmp_%~nx0"
set "line_%nb%=%line%"
goto :eof





Voilà, j'espère t'avoir aider Mr. Green
Si tu as d'autres questions n'hésite surtout pas Okay




______________________________________________________
la vie est trop courte pour retirer le périphérique USB en toute sécurité...
Si la statue de la liberté lève le bras depuis 125 ans, c'est parce qu'elle cherche du réseau sur son Blackberry Torches...
Grâce à mon nouveau correcteur automatiste sur mon téléphage, je ne fais plus aucune faute d'orthodontie.
Quelqu'un a t il déjà demandé au drapeau japonais ce qu'il enregistre depuis tout ce temps ?
Visiter le site web du posteur
Répondre en citant
Message Re: Récupérer une ligne précise d'un fichier texte 
Eh ben, c'est extrêmement complet ! Very Happy

Merci beaucoup, je vais intégrer ça de suite à mon fichier ^^.


A bientôt !

Froxil




______________________________________________________
Pourquoi faire compliqué lorsqu'on peut faire encore plus compliqué ?
Répondre en citant
Message Récupérer une ligne précise d'un fichier texte 
Flamm, je trouve que tu compliques trop ton code.

Je fais ton truc en 1 ligne Wink
Code:
@Echo off
call :getline test.txt 7
echo Ligne 7 : %line%
goto :eof

:getline
<%1 (for /l %%A in (1 1 %~2) do (set "line=" & set /p "line="))


Le pire, c'est que c'est plus rapide que ton code Mr. Green



Dernière édition par TSnake41 le Lun 17 Avr 2017 - 15:41; édité 1 fois

______________________________________________________
Partager permet le savoir. Le savoir permet de partager de nouveau savoirs.
Répondre en citant
Message Récupérer une ligne précise d'un fichier texte 
TSnake41 a écrit:
Flamm, je trouve que tu compliques trop ton code.

Je fais ton truc en 1 ligne Wink
Code:
@Echo off
call :getline test.txt 7
echo Ligne 7 : %line%
goto :eof

:getline
<%1 (for /l %%A in (0 1 %~2) do (set "line=" & set /p "line="))


Le pire, c'est que c'est plus rapide que ton code Mr. Green



De 1 ton code se gour de 1 ligne
De 2 mon code est une infinité de fois plus rapide que le tiens

J'ai créé un fichier de 15 000 lignes, et à 1er vue ton code m'affiche la mauvaise ligne et il met 4-5 secondes de + que le mien (le mien prend moins de 1sec)


Je n'ai pas compliqué le code pour rien ne tkt pas pour moi, j'ai tout misé sur la vitesse et non sur le nombre de lignes.
Que le code fasse quelques kilo de + pour être plus rapide et plus performant à long terme, je dis oui.
Ton code est excellent pour des petits fichiers et non des gros



Ton code est plus rapide que le mien sur les 1000 premières lignes certes mais pas sur les infinités de lignes restantes


p.s : je savais que tu allais poster une réponse de ce type xDD
J'ai prévu avant même de faire mon code que tu allais faire un truc de ce style Mr. Green


edit : de + ton code n'inclut pas le stockage du contenu des lignes automatiquement



Test de vitesse :
Code:
@echo off

set "file=mon_fichier.txt"


if exist %file% del /q %file%
echo;Generation du fichier de 30 000 lignes..
for /l %%a in (0,1,30000) do echo;RIEN%%a >> %file%
echo;Generation terminee !
echo;


echo;
echo;La 30 000 ligne correspond a : RIEN29999
echo;


echo;Execution du code Flamm :
call :GetLineFlamm "%file%" 30000
echo;Code de Flamm : %line%
echo;Execution terminee !
echo;


echo;Execution du code TSnake :
call :GetLineTSnake "%file%" 30000
echo;Code de TSnake : %line%
echo;Execution terminee !
echo;




 
:GetLineTSnake
<%1 (for /l %%A in (0 1 %~2) do (set "line=" & set /p "line="))
goto :eof



:GetLineFlamm <file> <Nb>
if "%~1"=="" pause>nul&exit
set "tmpFile=%~1"
set /a nb=%~2
set /a nbSkip=%nb%-1
( echo;for /f "skip=%nbSkip% tokens=*" %%%%l in ^('type "%tmpFile%"'^) do set "line=%%%%l"^&goto :GetLineok&echo;:GetLineok )> "%temp%\tmp_%~nx0"
call "%temp%\tmp_%~nx0"&del /q "%temp%\tmp_%~nx0"
set "line_%nb%=%line%"
goto :eof


edit 2 : mon code possède une sécurité permettant de protéger la fonction si l'exécution du script ne passe pas par le label et s'il n'y pas d'arguments




______________________________________________________
la vie est trop courte pour retirer le périphérique USB en toute sécurité...
Si la statue de la liberté lève le bras depuis 125 ans, c'est parce qu'elle cherche du réseau sur son Blackberry Torches...
Grâce à mon nouveau correcteur automatiste sur mon téléphage, je ne fais plus aucune faute d'orthodontie.
Quelqu'un a t il déjà demandé au drapeau japonais ce qu'il enregistre depuis tout ce temps ?
Visiter le site web du posteur
Répondre en citant
Message Récupérer une ligne précise d'un fichier texte 
Citation:
De 1 ton code se gour de 1 ligne
J'ai fixé ce problème Mr. Green

Citation:
De 2 mon code est une infinité de fois plus rapide que le tiens
Hmm, non, en fait, la différence est pas si importante que ça.
Perso, j'ai 1s de différence ce qui n'est pas non plus énorme.

Citation:
Ton code est plus rapide que le mien sur les 1000 premières lignes certes mais pas sur les infinités de lignes restantes

Citation:
Que le code fasse quelques kilo de + pour être plus rapide et plus performant à long terme, je dis oui.
Ton code est plus rapide (pour des gros fichiers), certe, mais clairement moins propre et clair (donc difficile à comprendre et corriger en cas d'éventuel bug).

Si je regarde, ton code est 4.5x plus volumineux que le miens pour être que dans le pire des cas : 1.7x plus rapide.
Et pour la plupart des autres cas courants (petits fichiers) : plus lent.

Donc c'est pas vraiment intéressant.

Citation:
edit : de + ton code n'inclut pas le stockage du contenu des lignes automatiquement
Normal, ça n'aurait pas servi à grand chose Mort de Rire




______________________________________________________
Partager permet le savoir. Le savoir permet de partager de nouveau savoirs.
Répondre en citant
Message Récupérer une ligne précise d'un fichier texte 
Au passage, au lieu de vous disputer Mr. Green , j'ai un bug de ma batbox ; au lieu d'effectuer les goto lors des clics, ça séléctionne l'endroit cliqué. Ca ne me faisait pas ça avant. Une idée ? Rolling Eyes




______________________________________________________
Pourquoi faire compliqué lorsqu'on peut faire encore plus compliqué ?
Répondre en citant
Message Récupérer une ligne précise d'un fichier texte 
Tu fais un clic droit sur l'icône de la fenêtre tout en haut à gauche dans la barre de titre et tu clique sur "Propriétés" :




Puis tu va dans l'onglet "Option" si ce n'est pas le cas :




Ensuite tu décoche "Mode d'édition rapide" comme indiquer sur l'image ci-dessous et pour finir tu valide en cliquant sur OK






TSnake41 a écrit:
Citation:
De 1 ton code se gour de 1 ligne
J'ai fixé ce problème Mr. Green

Citation:
De 2 mon code est une infinité de fois plus rapide que le tiens
Hmm, non, en fait, la différence est pas si importante que ça.
Perso, j'ai 1s de différence ce qui n'est pas non plus énorme.

Citation:
Ton code est plus rapide que le mien sur les 1000 premières lignes certes mais pas sur les infinités de lignes restantes

Citation:
Que le code fasse quelques kilo de + pour être plus rapide et plus performant à long terme, je dis oui.
Ton code est plus rapide (pour des gros fichiers), certe, mais clairement moins propre et clair (donc difficile à comprendre et corriger en cas d'éventuel bug).

Si je regarde, ton code est 4.5x plus volumineux que le miens pour être que dans le pire des cas : 1.7x plus rapide.
Et pour la plupart des autres cas courants (petits fichiers) : plus lent.

Donc c'est pas vraiment intéressant.

Citation:
edit : de + ton code n'inclut pas le stockage du contenu des lignes automatiquement
Normal, ça n'aurait pas servi à grand chose Mort de Rire


Comme tu le sais, je suis pas fort en batch alors je me débrouille comme je peux en faisant des codes de 10Giga, voilà Mr. Green




p.s. :

Signature de Froxil a écrit:
Pourquoi faire compliqué lorsqu'on peut faire encore plus compliqué ?


Je crois bien que c'est tout moi ça xDDD




______________________________________________________
la vie est trop courte pour retirer le périphérique USB en toute sécurité...
Si la statue de la liberté lève le bras depuis 125 ans, c'est parce qu'elle cherche du réseau sur son Blackberry Torches...
Grâce à mon nouveau correcteur automatiste sur mon téléphage, je ne fais plus aucune faute d'orthodontie.
Quelqu'un a t il déjà demandé au drapeau japonais ce qu'il enregistre depuis tout ce temps ?
Visiter le site web du posteur
Répondre en citant
Message Récupérer une ligne précise d'un fichier texte 
Ah ça marche... bof ! Ca fonctionne, mais il se réactive après un clic Shocked

Il y a un moyen de bloquer le mode ?


Et oui je sais, il faut toujours faire compliqué ^^'




______________________________________________________
Pourquoi faire compliqué lorsqu'on peut faire encore plus compliqué ?
Répondre en citant
Message Récupérer une ligne précise d'un fichier texte 
Dans ce cas fait la même chose mais clique sur "Par défaut" au lieu de "propriétés"




______________________________________________________


cliquer sur un des liens n'est pas dangereux
Ancien site,Nouveau site
Mon site de scan
Vous êtes le
visiteur
Chaine Youtube:
Visiter le site web du posteur Skype
Répondre en citant
Message Récupérer une ligne précise d'un fichier texte 
Hello,

déso d'être un peu à la bourre, mais j'ai ma petite solution (peut être pas plus rapide, mais qui sait:

Code:
@echo off

call :getline fichier.txt ligne 4
echo la ligne est %ligne%
exit

:getline
for /f "tokens=*" %%a in ('more +%%~3 "%%~1"') do (set %%~2=%%a
goto eof
)


Au fait, du coup, la première ligne, c'est la ligne 0 Wink

@+




______________________________________________________
--
> Que pensez vous de l'ajout du repertoire point dans $PATH ?
Ma version de troll 18.0.32 beta 3 vient de me faire un core dump.
-+- SE in Guide du Linuxien Pervers : Bien développer son troll -+-

[Dos9]
Visiter le site web du posteur Skype
Message Récupérer une ligne précise d'un fichier texte 


Montrer les messages depuis:
Répondre au sujet Page 1 sur 1
  



Index | créer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Copyright 2008 - 2016 // Batch