¿Cómo recorres cada línea en un archivo de texto usando un archivo por lotes de Windows?

StackOverflow https://stackoverflow.com/questions/155932

  •  03-07-2019
  •  | 
  •  

Pregunta

Me gustaría saber cómo recorrer cada línea en un archivo de texto usando un archivo por lotes de Windows y procesar cada línea de texto en sucesión.

¿Fue útil?

Solución

Las publicaciones a continuación ayudaron enormemente, pero no hicieron lo que dije en mi pregunta donde necesitaba procesar toda la línea en su totalidad. Esto es lo que encontré para trabajar.

for /F "tokens=*" %%A in (myfile.txt) do [process] %%A

La palabra clave tokens con un asterisco (*) extraerá todo el texto de toda la línea. Si no coloca el asterisco, solo tirará de la primera palabra en la línea. Supongo que tiene que ver con espacios.

Para el comando en TechNet

¡Aprecio todos los mensajes!


Si hay espacios en su ruta de archivo, necesita usar usebackq . Por ejemplo.

for /F "usebackq tokens=*" %%A in ("my file.txt") do [process] %%A

Otros consejos

Desde la referencia de la línea de comandos de Windows:

Para analizar un archivo, ignorando las líneas comentadas, escriba:

for /F "eol=; tokens=2,3* delims=," %i in (myfile.txt) do @echo %i %j %k

Este comando analiza cada línea en Myfile.txt, ignorando las líneas que comienzan con un punto y coma y pasando el segundo y tercer token de cada línea al cuerpo FOR (los tokens están delimitados por comas o espacios). El cuerpo de la instrucción FOR hace referencia a% i para obtener el segundo token,% j para obtener el tercer token y% k para obtener todos los tokens restantes.

Si los nombres de archivo que proporciona contienen espacios, use comillas alrededor del texto (por ejemplo, " Nombre de archivo "). Para usar comillas, debe usar usebackq. De lo contrario, las comillas se interpretan como la definición de una cadena literal para analizar.

Por cierto, puede encontrar el archivo de ayuda de la línea de comandos en la mayoría de los sistemas Windows en:

 "C:\WINDOWS\Help\ntcmds.chm"

En un archivo por lotes, DEBE utilizar %% en lugar de % : (escriba help for )

for /F "tokens=1,2,3" %%i in (myfile.txt) do call :process %%i %%j %%k
goto thenextstep
:process
set VAR1=%1
set VAR2=%2
set VAR3=%3
COMMANDS TO PROCESS INFORMATION
goto :EOF

Lo que esto hace: El " llamar: proceso %% i %% j %% k " al final del comando for pasa la información adquirida en el comando for de myfile.txt al " proceso " 'subrutina'.

Cuando estás usando el comando for en un programa por lotes, necesitas usar el doble de signos para las variables.

Las siguientes líneas pasan esas variables desde el comando for a la 'sub rutina' del proceso y le permiten procesar esta información.

set VAR1=%1
 set VAR2=%2
 set VAR3=%3

Tengo algunos usos bastante avanzados de esta configuración exacta que estaría dispuesto a compartir si se necesitaran más ejemplos. Agregue su EOL o Delims según sea necesario, por supuesto.

Mejorando el primer " FOR /F.." responder: Lo que tenía que hacer era llamar a ejecutar todos los scripts listados en MyList.txt, así que funcionó para mí:

for /F "tokens=*" %A in  (MyList.txt) do CALL %A ARG1

--OR, si desea hacerlo sobre la línea múltiple:

for /F "tokens=*" %A in  (MuList.txt) do (
ECHO Processing %A....
CALL %A ARG1
)

Editar: El ejemplo dado anteriormente es para ejecutar el ciclo FOR desde la línea de comandos; a partir de un script por lotes, se debe agregar un% adicional, como se muestra a continuación:

---START of MyScript.bat---
@echo off
for /F "tokens=*" %%A in  ( MyList.TXT) do  (
   ECHO Processing %%A.... 
   CALL %%A ARG1 
)
@echo on
;---END of MyScript.bat---

La respuesta de @ MrKraus es instructiva. Además, permítame agregar que si desea cargar un archivo ubicado en el mismo directorio que el archivo por lotes, prefije el nombre del archivo con% ~ dp0. Aquí hay un ejemplo:

cd /d %~dp0
for /F "tokens=*" %%A in (myfile.txt) do [process] %%A

NB: : si su nombre de archivo o directorio (por ejemplo, myfile.txt en el ejemplo anterior) tiene un espacio (por ejemplo, "my file.txt" o "c: \ Archivos de programa"), uso:

for /F "tokens=*" %%A in ('type "my file.txt"') do [process] %%A

, con la palabra clave tipo llamando al programa tipo , que muestra el contenido de un archivo de texto. Si no desea sufrir la sobrecarga de llamar al comando de tipo, debe cambiar el directorio al directorio del archivo de texto. Tenga en cuenta que todavía se requiere el tipo para los nombres de archivo con espacios.

¡Espero que esto ayude a alguien!

La respuesta aceptada es buena, pero tiene dos limitaciones.
Elimina las líneas vacías y las líneas que comienzan con ;

Para leer las líneas de cualquier contenido, necesita la expansión demorada técnica de alternar.

@echo off
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ text.txt"`) do (
    set "var=%%a"
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!"
    echo(!var!
    ENDLOCAL
)

Findstr se usa para prefijar cada línea con un número de línea y dos puntos, por lo que las líneas vacías ya no están vacías.

Se debe desactivar

DelayedExpansion, al acceder al parámetro %% a , de lo contrario los signos de exclamación ! y los caracteres ^ se perderán, ya que tienen significados especiales en ese modo.

Pero para eliminar el número de línea de la línea, la expansión demorada debe habilitarse.
set " var =! var: *: =! " elimina todos los dos puntos hasta el primer punto (usando delims =: eliminaría también todos los dos puntos al principio de línea, no solo la de findstr).
El endlocal desactiva la expansión retrasada de nuevo para la siguiente línea.

La única limitación es ahora el límite de longitud de línea de ~ 8191, pero parece que no hay forma de superar esto.

O, puede excluir las opciones entre comillas:

FOR /F %%i IN (myfile.txt) DO ECHO %%i

Aquí hay un archivo bat que escribí para ejecutar todos los scripts SQL en una carpeta:

REM ******************************************************************
REM Runs all *.sql scripts sorted by filename in the current folder.
REM To use integrated auth change -U <user> -P <password> to -E
REM ******************************************************************

dir /B /O:n *.sql > RunSqlScripts.tmp
for /F %%A in (RunSqlScripts.tmp) do osql -S (local) -d DEFAULT_DATABASE_NAME -U USERNAME_GOES_HERE -P PASSWORD_GOES_HERE -i %%A
del RunSqlScripts.tmp

Si tiene un Windows de la familia NT (uno con cmd.exe como shell), intente el comando FOR / F .

La respuesta aceptada usando cmd.exe y

for /F "tokens=*" %F in (file.txt) do whatever "%F" ...

funciona solo para " normal " archivos. Falla miserablemente con archivos enormes.

Para archivos grandes, es posible que necesites usar Powershell y algo como esto:

[IO.File]::ReadLines("file.txt") | ForEach-Object { whatever "

La respuesta aceptada usando cmd.exe y

for /F "tokens=*" %F in (file.txt) do whatever "%F" ...

funciona solo para " normal " archivos. Falla miserablemente con archivos enormes.

Para archivos grandes, es posible que necesites usar Powershell y algo como esto:

foreach($line in [System.IO.File]::ReadLines("file.txt")) { whatever "$line" } 

o si tienes suficiente memoria:

<*>

Esto me funcionó con un archivo de 250 MB que contiene más de 2 millones de líneas, donde el comando for / F ... se atascó después de unos pocos miles de líneas.

Para las diferencias entre foreach y ForEach-Object , consulte Conociendo ForEach y ForEach-Object .

(créditos: Lea línea por línea en PowerShell )

" }

o si tienes suficiente memoria:

<*>

Esto me funcionó con un archivo de 250 MB que contiene más de 2 millones de líneas, donde el comando for / F ... se atascó después de unos pocos miles de líneas.

Para las diferencias entre foreach y ForEach-Object , consulte Conociendo ForEach y ForEach-Object .

(créditos: Lea línea por línea en PowerShell )

Ejemplos modificados aquí para listar nuestras aplicaciones Rails en Heroku - ¡gracias!

cmd /C "heroku list > heroku_apps.txt"
find /v "=" heroku_apps.txt | find /v ".TXT" | findstr /r /v /c:"^<*>quot; > heroku_apps_list.txt
for /F "tokens=1" %%i in (heroku_apps_list.txt) do heroku run bundle show rails --app %%i

Código completo aquí .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top