ubicar linea en txt conociendo palabra [batch] (SOLUCIONADO)

Iniciado por flony, 20 Octubre 2009, 15:11 PM

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

flony

no se si se puede...pero se puede saber en que linea esta una palabra en un txt sabiendo que palabra es ?
ejm
Citarhola como estas me llamo
flony y y hoy por la noche salgo
y quiero sabr si salis vos
ae que flony esta en la segunda linea
si un problema no tiene solucion entonces no es un problema...es algo inevitable

Mr. Crowley

OK, creo que esto no se puede hacer con una sola funcion; para averiguar la linea en la que se encuentra:

1. Abra el archivo y recorralo linea por linea (llevando un contador de la linea procesada, logicamente)
2. "Pregunte" en cada linea si se encuentra la palabra (eso lo hace con la funcion InStr())

Si encuentra la linea, entonces detiene la escritura y cierra el archivo. Listo... facil  :xD
Mi blog personal: www.calirojas.com

FranciskoAsdf

yo necesito lo mismo pero en batch u.u alguien sabe como se puede hacer >.<?


de ante mano muchas gracias :)
Asdf debería ser algún tipo de función.

leogtz

type "file.txt" | find /n /i "flony"

O juega con findstr /n.

Saludos.
Código (perl) [Seleccionar]

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

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

<ИΘZIЭ(ŦB>

#4
Buenas... Sé que hay muchas maneras sencillas de hacer lo que piden, pero aquí te dejo un .bat que te servirá para eso. Espero les sea útil.

Código (dos) [Seleccionar]

@echo off
:Main
cls
set /p file=Indique el nombre del archivo:
set /p string=Indique la palabra a buscar:
echo.
setlocal enabledelayedexpansion
set /a nchar=0
call:Contar
set /a nlin=0
For /f "useback tokens=*" %%F in ("%file%") do (
     set /a nlin+=1
     set "line=%%F"
     set /a xcont=0
     call:Comparar
)
echo. & echo Terminado. & pause>nul & goto Main

:Contar
If /i "!string:~%nchar%,1!" == "" goto:eof
set /a nchar+=1
goto Contar

:Comparar
If /i "!line:~%xcont%,%nchar%!" == "%string%" (
     set mtch=T
     call:Msj
)
If /i "!line:~%xcont%,%nchar%!" == "" (
     set mtch=F
     call:Msj
     goto:eof
)
set /a xcont+=1
goto Comparar

:Msj
If "%mtch%" == "T" (
     echo PALABRA ENCONTRADA: [LINEA %nlin%] %line% & echo.
     call:Choice
)
If "%mtch%" == "F" echo LINEA %nlin%: %line%
goto:eof

:Choice
set /p ch=¨Continuar la b£squeda (S/N)?:
If not defined ch goto Choice
If /i %ch% == s goto:eof
If /i %ch% == n goto Main
goto:eof

flony

#5
cyman sos un capo  ;-)  probe el bat y es exactamente lo que estaba buscando  ;D mil gracias...o sea esta resuelto...mil gracias a todos...jijiji me lo pongo a traducir al  codigo del bat
Lo estuve leyendo y esto es lo que no entiendo si me lo pueden explicar seria genial para entender xq y como lo hizo
Citarset "line=%%F"
Citar"!string:~%nchar%,1!"
si un problema no tiene solucion entonces no es un problema...es algo inevitable

<ИΘZIЭ(ŦB>

#6
Qué bueno que te sirviera! Puedo decirte que lo que sé de Batch lo he aprendido solo aquí en el foro y en tan solo unos meses gracias a la ayuda de los compañeros y moderadores que de verdad están dispuestos a ayudar. De modo que me uno a ti en el agradecimiento.

Lo de tus preguntas es muy sencillo.

En primer lugar:
set "line=%%F"

Si te fijas bien, lo que hago en esta línea es crear la variable line con el valor de la variable del FOR (%%F), pues esta última se encarga de extraer el texto de cada línea del archivo que indicaste. Por eso le di el nombre "line" (línea) a esa variable.

For /f "useback tokens=*" %%F in ("%file%") do (
...
set "line=%%F"
...
)


Tu segunda duda:
"!string:~%nchar%,1!"

Bueno, esta línea la uso en la etiqueta :Contar para saber cuántos caracteres (nchar) tiene la palabra que indicaste (string) para buscar en el archivo de texto (file). Si te fijas, esta etiqueta lo que hace es ir sumando nchar hasta que llega al último caracter. Déjame darte algunos ejemplos:

Si tengo la variable "VAR=Hola mundo" y quiero mostrar su valor, solo debo usar un echo:
echo Valor de VAR: "%VAR%"
Se mostraría esto:
Valor de VAR: "Hola mundo"

Ahora, si no quiero ver todo su contenido sino una fracción, por ejemplo, los primeros tres caracteres, haría lo siguiente:
echo Valor fraccionado de VAR: "%VAR:~0,3%"
El primer número indica la posición (0) y el segundo (3) los caracteres que se mostrarán desde esa posición. Así pues, el resultado de esto sería:
Valor fraccionado de VAR: "Hol"

Bueno, no sé si ya conocías ese detalle, pero por si acaso lo expliqué.

Ahora bien, debes haber notado que en mi código original hay algunas diferencias, particularmente respecto a los dos signos de admiración (!) que usé. Esto se debe a que necesitaba usar una variable para determinar la posición, en vez de indicarla directamente con un número. No funcionaría de hacerlo de este modo:
%string:~%nchar%,1%
Ahora bien, debo mencionar que para que puedan usarse estos signos (!) en vez de los porcentajes (%) hay que escribir la línea:
setlocal enabledelayedexpansion
que si ves, usé al principio antes de llamar a la etiqueta :Contar. Eso lo aprendí hace poco, aunque debo confesar que no entiendo bien por qué es necesario. He leído que tiene que ver con unas tales variables retardadas, pero hasta ahí.

Creo que esto abarca lo de tus dudas, y tal vez más... Jaja! Espero que por lo menos hayas quedado claro.

flony

#7
muy bien explicado  ::)....eso es tener ganas de enseñar  ;-) ...gracias men...es mas me diste un ejemplo practico de para que sirve la polimetria...q apenas entiendo bien
este bue problema solucionado
si un problema no tiene solucion entonces no es un problema...es algo inevitable