Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: <ИΘZIЭ(ŦB> en 24 Agosto 2009, 00:23 am



Título: Cómo almacenar una línea específica de un .txt en una variable SOLUCIONADO!
Publicado por: <ИΘZIЭ(ŦB> en 24 Agosto 2009, 00:23 am
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:

Código:
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:

Código:
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í:

Código:
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.


Título: Re: Cómo almacenar una línea específica de un .txt en una variable
Publicado por: leogtz en 24 Agosto 2009, 06:57 am
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
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set contador=0
  4. for /f "eol= tokens=* delims=" %%x in (file.txt) do (
  5. set /a contador+=1
  6. set linea!contador!=%% style="color: #448888;">x
  7. )
  8. set linea

Para acceder a una línea en especifico, podrías hacer :
Código:
echo !linea%contador%!

En el caso de el código que has propuesto, este:
Código:
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 :
Código:
set "variable=!lin%indice%!"
Para mostrar es lo mismo:
Código:
echo !lin%indice o valor%!

Saludos.


Título: Re: Cómo almacenar una línea específica de un .txt en una variable
Publicado por: <ИΘZIЭ(ŦB> en 24 Agosto 2009, 16:42 pm
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:

Código:
@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ó:

Código:
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.)


Título: Re: Cómo almacenar una línea específica de un .txt en una variable
Publicado por: leogtz en 24 Agosto 2009, 17:01 pm
Quita el "endlocal" y nos dices, en caso de que no funcione ahora sí que consigo un Windows y te ayudo mejor.


Título: Re: Cómo almacenar una línea específica de un .txt en una variable
Publicado por: <ИΘZIЭ(ŦB> en 24 Agosto 2009, 18:20 pm
¡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:

Código:
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í:

Código:
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.