Cómo almacenar una línea específica de un .txt en una variable SOLUCIONADO!

Iniciado por <ИΘZIЭ(ŦB>, 24 Agosto 2009, 00:23 AM

0 Miembros y 1 Visitante están viendo este tema.

<ИΘZIЭ(ŦB>

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.

leogtz

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.
Código (dos) [Seleccionar]

@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.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

<ИΘZIЭ(ŦB>

#2
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.)

leogtz

Quita el "endlocal" y nos dices, en caso de que no funcione ahora sí que consigo un Windows y te ayudo mejor.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

<ИΘZIЭ(ŦB>

#4
¡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.