Batch. Encontrar palabra en frase

Iniciado por Stealt, 29 Agosto 2013, 09:13 AM

0 Miembros y 2 Visitantes están viendo este tema.

Stealt

Hola, tengo que hacer un script en batch que encuentre una palabra en una frase dadas ambas por el usuario. Y contar cuantas veces aparece la palabra en la frase.

No puedo usar FOR, ahí me jodieron bien.

He pensado en aislar las palabras entre los espacios contando estos pero en mitad del código me lio mucho.


Si queréis dejarme el código vale, pero también acepto ideas sobre cómo hacer.

Un saludo :D




Bueno, tenía en problema que intentaba trabajar solo con variables, recogiendo la frase y la palabra a buscar en la frase, he visto que es imposible y estoy probando a mandar la frase a un .txt con echo, y luego usar find para buscar la palabra, el problema es que me muestra las lineas que la contienen, alguna idea para que mande las palabras al .txt de a una por linea?


[MOD] NO hagas doble post, usa el botón "modificar", para añadir comentarios.

apuromafo CLS

no tengo muchas ideas sin for, pero algo se ocurre:
la idea:
uso de "findstr " para enlistar palabras de cierto "largo"
luego guardaste en otro archivo
luego type y find para tomar el listado creado anterior y enlistar la cantidad de palabras que querías encontrar

revisa esta fuente: http://foro.elhacker.net/scripting/acciones_sobre_archivos_de_texto_batch-t242748.0.html

Eleкtro

#2
Cita de: Stealt en 29 Agosto 2013, 09:13 AMNo puedo usar FOR, ahí me jodieron bien.

Es totálmente necesario usar FOR para la tarea que pides, ¿Quien te ha dicho que no lo uses, o porque dices que no puedes usarlo?... si no puedes usarlo, no puedes hacer la tarea usando Batch, es así de simple.

Cita de: Stealt en 29 Agosto 2013, 09:13 AMHe pensado en aislar las palabras entre los espacios

Para hacer un Split necesitas usar FOR, entonces no puedes separar las palabras de ningún modo.

Cita de: Stealt en 29 Agosto 2013, 09:41 AMalguna idea para que mande las palabras al .txt de a una por linea?

Para eso tienes que hacer un ciclo sobre las palabras procesándolas una a una, es decir, se necesita usar FOR.



PD: No te codeo ninguna solución porque dices que no puedes usar FOR (aunque no hay otra manera de hacerlo), además en Google puedes encontrar miles de ejemplos.



Saludos!






Bueno al final he codeado un ejemplo para mostrarte, aunque lo repito de nuevo, NO SE PUEDE HACER SIN USAR FOR.

Este código es una porquería (porque sin FOR no se puede hacer más que una porquería como esta), está limitado a procesar sólamente 255 palabras (es el límite de Batch) y además no puedes escribir caracteres conflictivos en la Frase, ya que sin el uso de FOR pues es lo que hay, no hay otras alternativas.

Sincéramente no te recomiendo para nada que lo hagas sin usar FOR, FOR existe para usarlo, no sé si es que eso de "no puedo usar FOR" es algún tipo de reto o lo has leido en algún tutorial o algo parecido... pero desde luego es algo ridículo que no tiene ningún sentido, ya que la forma más eficiente es usar FOR.

...Y debes acostumbrarte a usar FOR, ya que un búcle simplifica mucho las cosas y de lo contrario vas a tener que escribir y repetir miles de lineas de código, es decir, si no usas FOR vas a ser un guarro codeando en lugar de un coder eficiente, como en el siguiente código que te muestro ...el cual es una simple muestra de como hacer lo que pides sin usar FOR, pero realmente como ya he comentado no puedes hacerlo de manera decente y/o eficiente sin usar FOR, no busques alternativas que no existen, yo no me sentiria nada orgulloso de hacer este tipo de códigos cuando existen formas eficientes de hacerlo usando FOR.






Código (dos) [Seleccionar]
@Echo OFF


Set /P "Phrase=  Escribe la frase   >> "
Set /P "FindWord=Escribe la palabra >> "
Call :WordCount %Phrase%
Pause&Exit


:WordCount

:: %1 - %9
(Echo "%~1" & Echo "%~2" & Echo "%~3" Echo "%~4" & Echo "%~5" & Echo "%~6" Echo "%~7" & Echo "%~8" & Echo "%~9")> "%TEMP%\Words.tmp"
Shift & Shift & Shift Shift & Shift & Shift Shift & Shift & Shift

:: %10 - %18
(Echo "%~1" & Echo "%~2" & Echo "%~3" Echo "%~4" & Echo "%~5" & Echo "%~6" Echo "%~7" & Echo "%~8" & Echo "%~9")>> "%TEMP%\Words.tmp"
Shift & Shift & Shift Shift & Shift & Shift Shift & Shift & Shift

:: %19 - %27
(Echo "%~1" & Echo "%~2" & Echo "%~3" Echo "%~4" & Echo "%~5" & Echo "%~6" Echo "%~7" & Echo "%~8" & Echo "%~9")>> "%TEMP%\Words.tmp"
Shift & Shift & Shift Shift & Shift & Shift Shift & Shift & Shift

:: %28 - %36
:: Repetir el mismo proceso hasta deslizar la posición de los argumentos hasta alcanzar el parámetro límite de Batch, el %255.

Echo+
Echo Coincidencias:     | MORE
Type "%TEMP%\Words.tmp" | FIND /C /I "%FindWord%" | MORE
GOTO :EOF








SmartGenius

@Echo Off

Set /p "Frase=Frase >"
Set /p "Word=Palabra >"
Call :Comp %Frase%
Echo. Coincidencias: %C%
Pause&Exit

:Comp
If "%~1"=="" Goto :Eof
If "%~1"=="%Word%" Set /a "C+=1"
Shift&Goto :Comp


:silbar:


Eleкtro

#4
Buena observación

PD: Aunque me sigue pareciendo ridículo el problema por la necesidad de usar métodos recursivos cuando disponemos de FOR para simplificarlo de forma más eficiente.

Saludos!