¿Cómo puedo leer la primera línea de un archivo de texto usando un archivo por lotes de Windows? Dado que el archivo es grande, solo quiero ocuparme de la primera línea.
¿Cómo puedo leer la primera línea de un archivo de texto usando un archivo por lotes de Windows? Dado que el archivo es grande, solo quiero ocuparme de la primera línea.
Respuestas:
Aquí hay un archivo por lotes de uso general para imprimir las n
líneas superiores de un archivo como la head
utilidad GNU , en lugar de una sola línea.
@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
Por ejemplo:
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
Actualmente no cuenta líneas en blanco. También está sujeto a la restricción de longitud de línea de archivo por lotes de 8 KB.
;
, el carácter predeterminado de FOR / F EOL. Si solicita 10 líneas, imprimirá las primeras 10 líneas que no están vacías y no comienzan con ;
.
uh? imo esto es mucho más simple
set /p texte=< file.txt
echo %texte%
echo %texte:~3%
por ejemplo, omitirá los primeros tres caracteres. Eso es útil cuando está leyendo un archivo UTF-8 con BOM.
Uh chicos ...
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:"
y ganar la calidez y protección de las comillas dobles. O, si desprecia las citas como yo y quiere vivir peligrosamente, usefindstr /b 1:
findstr ^^1
.
set /p
solución es mucho más eficiente para archivos grandes.
Podrías probar esto:
@echo off
for /f %%a in (sample.txt) do (
echo %%a
exit /b
)
editar O, digamos que tiene cuatro columnas de datos y desea desde la quinta fila hacia abajo, intente esto:
@echo off
for /f "skip=4 tokens=1-4" %%a in (junkl.txt) do (
echo %%a %%b %%c %%d
)
"delims="
para imprimir los nombres completos de las carpetas junto con los espacios.
Gracias a thetalkingwalnut con los comandos por lotes de Windows de respuesta para leer la primera línea del archivo de texto, se me ocurrió la siguiente solución:
@echo off
for /f "delims=" %%a in ('type sample.txt') do (
echo %%a
exit /b
)
Construyendo ligeramente sobre las respuestas de otras personas. Ahora le permite especificar el archivo desde el que desea leer y la variable en la que desea que se coloque el resultado:
@echo off
for /f "delims=" %%x in (%2) do (
set %1=%%x
exit /b
)
Esto significa que puede usar lo anterior así (asumiendo que lo llamó getline.bat)
c:\> dir > test-file
c:\> getline variable test-file
c:\> set variable
variable= Volume in drive C has no label.
Prueba esto
@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
El problema con las EXIT /B
soluciones, cuando es más realista dentro de un archivo por lotes como solo una parte, es el siguiente. No hay procesamiento posterior dentro de dicho archivo por lotes después del EXIT /B
. Por lo general, los lotes son mucho más que una sola tarea limitada.
Para contrarrestar ese 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
(Sin embargo, los llamados personajes venenosos seguirán siendo un problema).
Más sobre el tema de obtener una línea en particular con comandos por lotes:
¿Cómo obtengo la enésima, la primera y la última línea de un archivo de texto? " Http://www.netikka.net/tsneti/info/tscmd023.htm
[Agregado el 28 de agosto de 2012] También se puede tener:
@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
Para Cicle un archivo ( 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%
Y está funcionando.
set /p
pregunta mediante un mensaje; sin embargo, con la redirección de archivos <
, obtiene inmediatamente el contenido del archivo cuando se le solicita; y como la primera línea termina con un final de línea, en ese punto el indicador deja de leer y, por lo tanto, almacena solo la primera línea de la variable.
Tenga en cuenta que los enfoques de archivos por lotes se limitarán al límite de línea para el procesador de comandos de DOS; consulte ¿Cuál es el límite de longitud de la línea de comando? .
Entonces, si intenta procesar un archivo que tiene líneas de más de 8192 caracteres, el script simplemente los omitirá ya que el valor no se puede retener.
De otra manera
setlocal enabledelayedexpansion
@echo off
for /f "delims=" %%i in (filename.txt) do (
if 1==1 (
set first_line=%%i
echo !first_line!
goto :eof
))
Aquí hay una solución que usa powershell
:
powershell (Get-Content file.txt)[0]
(También puede leer fácilmente un rango de líneas con powershell (Get-Content file.txt)[0..3]
)
Si necesita establecer una variable dentro de un script por lotes como primera línea file.txt
, puede usar:
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
Imprime la primera línea, luego espera a que el usuario presione una tecla para imprimir la siguiente línea. Después de imprimir las líneas requeridas, presione Ctrl + C para detener.
@Ross Presser: este método solo imprime líneas, no antepone números de línea.