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.¿Cómo recorre cada línea en un archivo de texto usando un archivo de lote de Windows?
Respuesta
Las publicaciones a continuación ayudaron mucho, pero no hicieron lo que dije en mi pregunta donde necesitaba procesar toda la línea como un todo. 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 obtendrá la primera palabra en la línea. Supongo que tiene que ver con espacios.
aprecio todos los mensajes!
Si tiene un Windows NT-family (uno con cmd.exe
como shell), intente the FOR /F command.
A partir de la referencia de línea de comandos de Windows:
analizar un archivo, haciendo caso omiso de líneas de comentarios, escriba:
for /F "eol=; tokens=2,3* delims=," %i in (myfile.txt) do @echo %i %j %k
Este comando lee cada línea en Miarchivo.txt, haciendo caso omiso de las líneas que comienzan con un punto y coma y pasar el segundo y el 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, a% j para obtener el tercer token y a% 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, se puede encontrar el archivo de ayuda de línea de comandos en la mayoría de los sistemas Windows en:
"C:\WINDOWS\Help\ntcmds.chm"
aquí hay un archivo del palo que escribí para ejecutar todas las secuencias de comandos 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
Omita el archivo temporal y simplemente use para/f %% A en ('dir/b/o: n * sql') do ... –
O bien, puede excluir las opciones entre comillas:
FOR /F %%i IN (myfile.txt) DO ECHO %%i
Obtengo el error: %% i inesperado en este momento –
Dos signos de porcentaje uno al lado del otro %% se tratan como un solo signo de porcentaje en un comando (no en un archivo por lotes). – Paul
en un lote que Archivo MUST uso %%
en lugar de %
: (Tipo 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 "do call: process %% 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á utilizando el comando for en un programa por lotes, debe usar signos de doble% para las variables.
Las siguientes líneas pasan esas variables desde el comando para al proceso 'sub rutina' y le permiten procesar esta información.
set VAR1=%1
set VAR2=%2
set VAR3=%3
que tienen algunos usos muy avanzadas de esta configuración exacta que yo estaría dispuesto a compartir si se necesitan más ejemplos. Agregue su EOL o Delims según sea necesario, por supuesto.
Mejora de la primera "A/F .." respuesta: Lo que tenía que hacer era llamar a ejecutar todos los guiones que figuran en MyList.txt, por lo que funcionó para mí:
for /F "tokens=*" %A in (MyList.txt) do CALL %A ARG1
-OR , si desea hacerlo por varias líneas:
for /F "tokens=*" %A in (MuList.txt) do (
ECHO Processing %A....
CALL %A ARG1
)
Editar: el ejemplo anterior es para la ejecución del bucle FOR símbolo del sistema; de un lote-escritura, un% extra hay que añadir, 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---
ejemplos Modded 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:"^$" > 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 here.
Por [comentario a otra pregunta más arriba] (http://stackoverflow.com/questions/155932/random-string-to-show-comment-highlighting#comment47265_155954) - Puede omitir la creación/lectura del archivo y simplemente usar 'para/f "tokens = 1" %% i in ('buscar/v' = "heroku_apps.txt^| find/v ".TXT"^| findstr/r/v/c: "^ $" ') do ... '(Observe la adición de'^'' s utilizada para escapar de la tubería, de modo que se pase al' for' y no directamente al procesador de comandos) – user66001
@ MrKraus's answer es instructivo. Además, permítame agregar que si desea cargar un archivo ubicado en el mismo directorio como archivo por lotes, prefija el nombre del archivo con% ~ dp0. Aquí está un ejemplo:
cd /d %~dp0
for /F "tokens=*" %%A in (myfile.txt) do [process] %%A
NB:: Si el nombre del archivo o directorio (por ejemplo miarchivo.txt en el ejemplo anterior) tiene un espacio (por ejemplo, 'mi archivo.txt' o 'c: \ Program archivos), utilice:
for /F "tokens=*" %%A in ('type "my file.txt"') do [process] %%A
, con el tipo palabra clave llamando al programa type
, que muestra el contenido de un archivo de texto. Si no quiere sufrir la sobrecarga de llamar al comando type, debe cambiar el directorio al directorio del archivo de texto. Tenga en cuenta que todavía se requiere el tipo para los nombres de archivos con espacios.
Espero que esto ayude a alguien!
No hay necesidad de agregar un prefijo al nombre del archivo ya que el archivo por lotes se verá en la carpeta actual de forma predeterminada. – foxidrive
@foxidrive: Bien, te escucho. Aunque se debe tener cuidado. Por ejemplo, si se cambió un directorio, se miraría en ese directorio en lugar de en el que está el archivo por lotes. La solución sería llamar a '** cd/d% ~ dp0 **' antes del ciclo for. Esto aseguraría que esté haciendo referencia a un archivo en el directorio en el que se encuentra el archivo por lotes. Gracias por la observación –
Thx y +1 por el paseo tipo 'type' – halex
La respuesta aceptada es buena, pero tiene dos limitaciones.
cae líneas vacías y líneas que comienzan con ;
Para leer las líneas de cualquier contenido, lo que necesita la técnica de conmutación de expansión retardada.
@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 utiliza para prefijar cada línea con el número de línea y dos puntos, por lo que las líneas vacías no están vacíos más.
DelayedExpansion tiene que ser desactivado, al acceder al parámetro %%a
, signos de admiración demás !
y signos de intercalación ^
se perderán, ya que tienen un significado especial en ese modo.
Pero para eliminar el número de línea de la línea, la expansión retrasada debe habilitarse.
set "var=!var:*:=!"
elimina todo hasta los primeros dos puntos (utilizando delims=:
eliminaría también todos los dos puntos al principio de una línea, no solo el de findstr).
endlocal desactiva la expansión retardada de nuevo para la siguiente línea.
La única limitación ahora es el límite de longitud de línea de ~ 8191, pero parece que no hay manera de superar esto.
- 1. jquery: ¿cómo recorre cada línea nueva de texto escrito dentro de un área de texto?
- 2. Comandos de lote de Windows para leer la primera línea del archivo de texto
- 3. Archivo de texto con^M en cada línea
- 4. ¿Cómo borrar la última línea en un archivo de texto?
- 5. Cómo imprimir el número de caracteres en cada línea de un archivo de texto
- 6. Eco de cadena con comillas dobles en el archivo de salida usando el lote de Windows
- 7. ¿Cómo puedo incrementar un valor en un archivo de texto usando la línea de comandos regular de Windows?
- 8. Lectura de un valor de un archivo en un script de lote de Windows
- 9. Leyendo un archivo de texto en MATLAB línea por línea
- 10. leyendo un archivo de texto en R línea por línea
- 11. ¿Cómo agregar una línea vacía en un archivo de texto usando la línea de comando?
- 12. Leer un archivo de texto línea por línea en Qt
- 13. Agregue texto a cada línea en el archivo de texto usando PowerShell
- 14. ¿Cómo puedo eliminar cada línea X en un archivo de texto?
- 15. ¿Lees un archivo de texto usando Node.js?
- 16. ¿Cómo puede encontrar y reemplazar texto en un archivo usando el entorno de línea de comandos de Windows?
- 17. Encontrar el tamaño de línea de cada fila en un archivo de texto
- 18. ¿Cómo finalizar un archivo de lote de Windows desde una rutina llamada?
- 19. Eliminación de los dos últimos caracteres de cada línea en un archivo de texto
- 20. Haskell: insertando cada línea de un archivo en una lista
- 21. Leyendo un archivo de texto en java
- 22. cómo dar salida a cada línea en un archivo python
- 23. ¿Cómo obtengo cada línea de un NSString?
- 24. ¿Cómo escribo en un archivo de texto usando AppleScript?
- 25. ¿Cómo guardo un cuadro de texto multilínea como una línea en un archivo de texto?
- 26. Cómo importar un archivo SQL usando mysqldump en Windows a través de la línea de comando
- 27. Crear una lista que contenga cada línea de un archivo
- 28. escribir nueva línea en un archivo de texto en Matlab
- 29. Contar filas en un archivo de texto
- 30. ¿Cómo eliminar saltos de línea de un archivo en Java?
A adición menor: para hacer que esto funcione desde la línea de comando de forma interactiva, reemplace '%% A' con'% A' en el comando anterior. De lo contrario, obtendrás '%% A inesperado en este momento'. – vadipp
FYI, si necesita hacer un comando de varias líneas, después de "DO" puede poner un paréntesis abierto "(" y unas líneas más tarde, finalícelo con un paréntesis de cierre ")" - y puede simplemente poner su bloque de código dentro de esos (sangrado a tus gustos). – BrainSlugs83
Si tiene problemas con archivos en la misma carpeta con archivos por lotes anidados, o archivos que tienen espacios en sus nombres, consulte mi solución a continuación. –