93 votes

Commande(s) batch Windows pour lire la première ligne d'un fichier texte

Comment lire la première ligne d'un fichier texte à l'aide d'un fichier batch Windows ? Le fichier étant volumineux, je ne veux traiter que la première ligne.

1 votes

Essayez l'utilitaire GNU32 "head". Ne pensez pas que ce que vous recherchez sera facilement accompli par un simple DOS Batch.

0 votes

@Nasir , cela ne peut-il pas être fait avec une commande intégrée ?

236voto

Spaceballs Points 804

euh ? imo ceci est beaucoup plus simple

  set /p texte=< file.txt  
  echo %texte%

16 votes

+1, C'est le meilleur quand il fonctionne :-) Il a les limites suivantes 1) La longueur maximale des lignes est de 1021 octets, sans compter l'EOL. 2) Le fichier doit utiliser le style Windows EOL de CarriageReturn LineFeed. 3) Les caractères de contrôle de fin de ligne seront supprimés de la ligne.

5 votes

De plus, le texte devrait être explicitement indéfini avant de lire le fichier, juste au cas où la première ligne serait vide.

1 votes

Ici Voici quelques conseils supplémentaires pour tailler la ficelle. echo %texte:~3% par exemple, ignorera les trois premiers caractères. Cela est utile lorsque vous lisez un fichier UTF-8 avec BOM.

52voto

indiv Points 7403

Voici un fichier batch à usage général pour imprimer le haut de la page n des lignes d'un fichier comme celui de GNU head au lieu d'une seule ligne.

@echo off

if [%1] == [] goto usage
if [%2] == [] goto usage

call :print_head %1 %2
goto :eof

REM
REM print_head
REM Prints the first non-blank %1 lines in the file %2.
REM
:print_head
setlocal EnableDelayedExpansion
set /a counter=0

for /f ^"usebackq^ eol^=^

^ delims^=^" %%a in (%2) do (
        if "!counter!"=="%1" goto :eof
        echo %%a
        set /a counter+=1
)

goto :eof

:usage
echo Usage: head.bat COUNT FILENAME

Par exemple :

Z:\>head 1 "test file.c"
; this is line 1

Z:\>head 3 "test file.c"
; this is line 1
    this is line 2
line 3 right here

Il ne compte pas actuellement les lignes vides. Il est également soumis à la restriction de longueur de ligne des fichiers de lot de 8 Ko.

11 votes

FYI : "GOTO :EOF" C'est une étiquette spéciale qui permet de quitter le script sans avoir à définir une étiquette spéciale ":exit". C'est aussi utile quand on définit des sous-routines dans le batch ( qu'est-ce que vous dites ? des sous-routines ? Yep ).

4 votes

Il semble qu'il y ait un problème avec mes fichiers texte de plusieurs Go... Sur l'un des fichiers, il m'a donné une erreur "Out of Memory" en essayant de retourner 10 lignes, sur l'autre fichier, il a juste retourné une seule ligne vierge en lui demandant de retourner 10 lignes. Une idée de la raison pour laquelle cela se produit ?

1 votes

@Dan - Quelle est la longueur des lignes ? FOR /F "ignore" les lignes de plus de 8191 octets. Mais je me demande si l'erreur "Out of Memory" ne survient pas s'il rencontre une ligne vraiment longue.

23voto

Amit Naidu Points 876

Euh, les gars...

C:\>findstr /n . c:\boot.ini | findstr ^1:

1:[boot loader]

C:\>findstr /n . c:\boot.ini | findstr ^3:

3:default=multi(0)disk(0)rdisk(0)partition(1)\WINNT

C:\>

2 votes

Si le fichier a plus de 11 lignes, il en imprimera plus que la première, comme : 1 :, 11 :, 21 :, etc...

2 votes

Bien vu, César ! J'essaie toujours d'éviter les guillemets parce qu'ils m'ennuient, mais dans ce cas, c'était une mauvaise idée. Pour corriger, changez en findstr "^1:" et bénéficier de la chaleur et de la protection des guillemets. Ou, si vous méprisez les guillemets comme moi et que vous voulez vivre dangereusement, utilisez findstr /b 1:

4 votes

Si vous le voulez sans guillemets et sans l'option /b, il suffit d'échapper le signe d'insertion : findstr ^^1 .

11voto

Vous pourriez essayer :

@echo off

for /f %%a in (sample.txt) do (
  echo %%a
  exit /b
)

modifier Ou, disons que vous avez quatre colonnes de données et que vous voulez partir de la cinquième ligne vers le bas, essayez ceci :

@echo off

for /f "skip=4 tokens=1-4" %%a in (junkl.txt) do (
  echo %%a %%b %%c %%d
)

1 votes

Cela m'a donné l'indice dont j'avais besoin, mais ce n'était pas tout à fait exact. Je ne suis pas sûr de la procédure à suivre mais j'ai incorporé cette solution dans la solution finale. voir stackoverflow.com/questions/130116#130209

2 votes

Le problème de cette solution est qu'elle délimite sur l'espace au lieu de la nouvelle ligne, et vous ne pouvez pas avoir un nom de fichier avec des espaces. Vous pouvez résoudre ces problèmes avec les options delims et usebackq dans la boucle for.

0 votes

Ça a marché pour moi, mais j'ai dû ajouter "delims=" pour imprimer les noms de dossiers complets avec les espaces.

6voto

Jesse Vogt Points 5014

Merci à thetalkingwalnut pour la réponse. http://stackoverflow.com/questions/130116/dos-batch-commands-to-read-first-line-from-text-file#130154 J'ai trouvé la solution suivante :

@echo off
for /f "delims=" %%a in ('type sample.txt') do (
echo %%a
exit /b
)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X