Domanda

Come posso leggere la prima riga da un file di testo usando un file batch di Windows? Poiché il file è di grandi dimensioni, voglio solo occuparmi della prima riga.

È stato utile?

Soluzione

Ecco un file batch per scopi generici per stampare le prime righe n da un file come l'utilità GNU head , invece di una sola riga.

@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

Ad esempio:

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

Al momento non conta le righe vuote. È inoltre soggetto alla limitazione della lunghezza della riga del file batch di 8 KB.

Altri suggerimenti

uh? imo questo è molto più semplice

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

Uh ragazzi ...

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

Puoi provarlo:

@echo off

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

modifica Oppure, supponi di avere quattro colonne di dati e desideri dalla quinta riga in basso, prova questo:

@echo off

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

Grazie a thetalkingwalnut con risposta Batch di Windows comando (i) per leggere la prima riga dal file di testo ho trovato la seguente soluzione:

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

Basandosi leggermente sulle risposte di altre persone. Ora ti consente di specificare il file da cui vuoi leggere e la variabile in cui vuoi inserire il risultato:

@echo off
for /f "delims=" %%x in (%2) do (
set %1=%%x
exit /b
)

Questo significa che puoi usare quanto sopra in questo modo (supponendo che tu l'abbia chiamato getline.bat)

c:\> dir > test-file
c:\> getline variable test-file
c:\> set variable  
variable= Volume in drive C has no label.

Un liner, utile per il reindirizzamento stdout con " > " ;:

@for /f %%i in ('type yourfile.txt') do @echo %%i & exit

Prova questo

@echo off
setlocal enableextensions enabledelayedexpansion
set firstLine=1
for /f "delims=" %%i in (yourfilename.txt) do (
    if !firstLine!==1 echo %%i
    set firstLine=0
)
endlocal

Il problema con le soluzioni EXIT / B , quando più realisticamente all'interno di un file batch come solo una parte di esso è il seguente. Non vi è alcuna successiva elaborazione all'interno di detto file batch dopo EXIT / B . Di solito c'è molto di più nei batch oltre al solo compito limitato.

Per contrastare questo problema:

@echo off & setlocal enableextensions enabledelayedexpansion
set myfile_=C:\_D\TEST\My test file.txt
set FirstLine=
for /f "delims=" %%i in ('type "%myfile_%"') do (
  if not defined FirstLine set FirstLine=%%i)
echo FirstLine=%FirstLine%
endlocal & goto :EOF

(Tuttavia, i cosiddetti personaggi velenosi rappresenteranno ancora un problema.)

Altre informazioni sull'argomento di ottenere una riga particolare con comandi batch:

  

Come posso ottenere l'ennesimo, il primo e l'ultimo rigo di un file di testo? "    http://www.netikka.net/tsneti/info/tscmd023.htm

[Aggiunto il 28 agosto 2012] Uno può anche avere:

@echo off & setlocal enableextensions
set myfile_=C:\_D\TEST\My test file.txt
for /f "tokens=* delims=" %%a in (
  'type "%myfile_%"') do (
    set FirstLine=%%a& goto _ExitForLoop)
:_ExitForLoop
echo FirstLine=%FirstLine%
endlocal & goto :EOF

Ecco una soluzione alternativa usando powershell :

powershell (Get-Content file.txt)[0]

(Puoi facilmente leggere anche un intervallo di righe con powershell (Get-Content file.txt) [0..3] )

Se devi impostare una variabile all'interno di uno script batch come prima riga di file.txt puoi usare:

for /f "usebackq delims=" %%a in (`powershell ^(Get-Content file.txt^)[0]`) do (set "head=%%a")

Nota, gli approcci al file batch saranno limitati al limite di linea per il processore di comandi DOS - vedi Qual è il limite di lunghezza della riga di comando? .

Quindi, se si tenta di elaborare un file che ha più righe di 8192 , lo script li salterà semplicemente perché il valore non può essere mantenuto.

Un altro modo

setlocal enabledelayedexpansion
@echo off
for /f "delims=" %%i in (filename.txt) do (
if 1==1 (
set first_line=%%i
echo !first_line!
goto :eof
))

Per ciclicare un file ( file1.txt , file1 [1] .txt , file1 [2] .txt , ecc.) :

START/WAIT C:\LAERCIO\DELPHI\CICLADOR\dprCiclador.exe C:\LAERCIUM\Ciclavel.txt

rem set/p ciclo=< C:\LAERCIUM\Ciclavel.txt:
set/p ciclo=< C:\LAERCIUM\Ciclavel.txt

rem echo %ciclo%:
echo %ciclo%

Ed è in esecuzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top