Saludos amigos foristas!
He estado indagando en la web cómo leer un archivo .txt línea por línea, y he logrado hacerlo. Con el comando Echo se pueden mostrar cada una individualmente.
Ahora, por más que he intentado no he logrado almacenar el texto de una línea específica en una variable. El código que encontré es este:
setlocal enabledelayedexpansion
:reader
set c=0
for /f "tokens=*" %%a in (archivo.txt) do (
set /a c+=1
call set lin!c!=Linea_!c! = %%a
)
echo Archivo Leido
for /l %%n in (1,1,!c!) do (echo !lin%%n!)
pause
endlocal
Como ven, puedo ver cada una de las líneas perfectamente, pero no sé cómo almacenar el valor de alguna de ellas en otra variable. Sé que la sentencia call set lin!c!=Linea_!c! = %%a crea una variable que almacena el texto de cada línea por separado, pero no sé cómo tomar esos valores. Nunca he trabajado con variables tipo matriz, así que quisiera pedir su ayuda para poder hacerlo.
Intenté de esta manera, tanteando a ver:
set variable=lin!2!
Trataba de tomar el texto de la línea 2 que la variable tiene almacenada, pero no funcionó. También intenté de este modo, según leí por ahí:
set variable=%%lin%2%%%
pero tampoco funcionó. Así pues, de verdad necesito que me echen una mano, porque como ven, estoy bien perdido! :D Debe ser algo simple, pero me servirá de mucho.
En mi articulo sobre "Acciones con archivos de texto", comenté como meter las líneas de un archivo en variables independientes, puedes consultarlo si quieres.
@echo off
setlocal enabledelayedexpansion
set contador=0
for /f "eol= tokens=* delims=" %%x in (file.txt) do (
set /a contador+=1
set linea!contador!=%%x
)
set linea
Para acceder a una línea en especifico, podrías hacer :
echo !linea%contador%!
En el caso de el código que has propuesto, este:
setlocal enabledelayedexpansion
:reader
set c=0
for /f "tokens=*" %%a in (archivo.txt) do (
set /a c+=1
call set lin!c!=Linea_!c! = %%a
)
echo Archivo Leido
for /l %%n in (1,1,!c!) do (echo !lin%%n!)
pause
endlocal
Para asignar :
set "variable=!lin%indice%!"
Para mostrar es lo mismo:
echo !lin%indice o valor%!
Saludos.
De nuevo gracias Leo por la ayuda, pero no me funciona. O sea, no puedo traerme el valor del un índice específico a otra variable, aunque con el Echo sí. No obstante, como lo mencioné antes, lo que me interesa es usar ese valor-índice en otra variable.
Mira lo que hice:
@echo off
setlocal enabledelayedexpansion
:reader
set c=0
for /f "tokens=*" %%a in (archivo.txt) do (
set /a c+=1
call set lin!c!=Linea_!c! = %%a
)
echo Archivo Leido
for /l %%n in (1,1,!c!) do (echo !lin%%n!)
endlocal
set indice=1
set "variable=!lin%indice%!"
echo %variable%
pause
Y este es el resultado que me dió:
Archivo Leido
Linea_1 = Texto 1
Linea_2 = Texto 2
!lin1!
Presione una tecla para continuar . . .
¿Ves? ¡No me funciona! No me almacena el texto 2 en %variable%, sino !lin1!. ¿Es que estoy haciendo algo mal? Te agradezco de antemano. (Ah, y si puedes pon el enlace al tema que mencionaste que no lo encontré por el buscador.)
Quita el "endlocal" y nos dices, en caso de que no funcione ahora sí que consigo un Windows y te ayudo mejor.
¡Listo! ¡Funcionó perfecto! De verdad te agradezco la ayuda, como siempre.
El único detalle fue que no me funcionó dentro de un If. Es decir, hice esto:
If condicion (
setlocal enabledelayedexpansion
set c=0
for /f "tokens=*" %%a in (archivo.txt) do (
set /a c+=1
call set lin!c!=Linea_!c! = %%a
)
for /l %%n in (1,1,!c!) do (echo !lin%%n!)
set indice=1
set "variable=!lin%indice%!"
echo %variable%
pause
)
Así no funcionó. Tuve que hacerlo así:
If condicion goto Linea
:Linea
setlocal enabledelayedexpansion
set c=0
for /f "tokens=*" %%a in (archivo.txt) do (
set /a c+=1
call set lin!c!=Linea_!c! = %%a
)
for /l %%n in (1,1,!c!) do (echo !lin%%n!)
set indice=1
set "variable=!lin%indice%!"
echo %variable%
pause
Así sí funcionó. Fue el único detalle, tal vez puedas explicar por qué pasó. Sería útil aprender más sobre eso. Por lo demás muchas gracias de verdad. Ah, y no olvides colocar el enlace al otro tema que mencionaste por favor.