Come posso leggere la prima riga da un file di testo utilizzando un file batch di Windows? Poiché il file è di grandi dimensioni, voglio occuparmi solo della prima riga.
Come posso leggere la prima riga da un file di testo utilizzando un file batch di Windows? Poiché il file è di grandi dimensioni, voglio occuparmi solo della prima riga.
Risposte:
Ecco un file batch generico per stampare le prime n
righe da un file come l' head
utilità GNU , invece di una singola 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
Per 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
Attualmente non conta le righe vuote. È inoltre soggetto alla limitazione della lunghezza della riga del file batch di 8 KB.
;
e virgola , il carattere predefinito EOL FOR / F. Se si richiedono 10 righe, verranno stampate le prime 10 righe che non sono vuote e non iniziano con ;
.
eh? 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:\>
findstr "^1:"
e ottieni il calore e la protezione delle virgolette doppie. Oppure, se disprezzi le citazioni come me e vuoi vivere pericolosamente, usafindstr /b 1:
findstr ^^1
.
set /p
soluzione è molto più efficiente per file di grandi dimensioni.
Potresti provare:
@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 fino in fondo, prova questo:
@echo off
for /f "skip=4 tokens=1-4" %%a in (junkl.txt) do (
echo %%a %%b %%c %%d
)
"delims="
per stampare i nomi completi delle cartelle insieme agli spazi.
Grazie a thetalkingwalnut con risposta ai comandi batch di Windows 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 permettendoti 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
)
Ciò significa che puoi usare quanto sopra in questo modo (supponendo che tu lo chiami getline.bat)
c:\> dir > test-file
c:\> getline variable test-file
c:\> set variable
variable= Volume in drive C has no label.
Per Cicle un file ( file1.txt
, file1[1].txt
, file1[2].txt
, etc.):
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.
set /p
chiede tramite un prompt; tuttavia con il reindirizzamento del file <
ottiene immediatamente il contenuto del file al prompt; e poiché la prima riga termina con una riga che termina, a quel punto il prompt interrompe la lettura e quindi memorizza solo la prima riga nella variabile.
Il problema con le EXIT /B
soluzioni, quando più realisticamente all'interno di un file batch come solo una parte di esso, è il seguente. Non vi è alcuna elaborazione successiva all'interno del suddetto file batch dopo l'estensione 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 saranno ancora un problema.)
Maggiori informazioni sull'argomento di ottenere una particolare riga con i comandi batch:
Come ottengo l'ennesima, la prima e l'ultima riga di un file di testo? " Http://www.netikka.net/tsneti/info/tscmd023.htm
[Aggiunto il 28 agosto 2012] Si 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
Nota, gli approcci ai file batch saranno limitati al limite di riga per il processore di comandi DOS - vedere Qual è il limite di lunghezza della riga di comando? .
Quindi, se si tenta di elaborare un file che ha righe più di 8192 caratteri, lo script li salterà semplicemente poiché 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
))
Ecco una soluzione alternativa utilizzando powershell
:
powershell (Get-Content file.txt)[0]
(Puoi leggere facilmente anche una serie di righe con powershell (Get-Content file.txt)[0..3]
)
Se è necessario impostare una variabile all'interno di uno script batch come prima riga, file.txt
è possibile utilizzare:
for /f "usebackq delims=" %%a in (`powershell ^(Get-Content file.txt^)[0]`) do (set "head=%%a")
for /f "delims=" %a in (downing.txt) do echo %a & pause>nul
Stampa la prima riga, quindi attende che l'utente prema un tasto per stampare la riga successiva. Dopo aver stampato le righe richieste, premere Ctrl + C per interrompere.
@Ross Presser: questo metodo stampa solo le righe, non antepone i numeri di riga.