Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Puntoinfinito en 17 Julio 2012, 12:31 pm



Título: [Reto Batch]Buscame en el log
Publicado por: Puntoinfinito en 17 Julio 2012, 12:31 pm
Nombre:           Buscame en el log - Puntoinfinito
Dificultad:         5/10
Objetivo:          El reto consiste en crear un log donde has de almacenar las   discografías de algún grupo de música. Como por ejemplo, la de Guns and Roses;
Código:
Fecha de lanzamiento 	Álbum 	                Ventas en el mundo
21 de julio de 1987        Appetite for Destruction 60 millones
29 de noviembre de 1988 G N' R Lies                13.3 millones
17 de septiembre de 1991 Use Your Illusion I        26.4 millones
17 de septiembre de 1991 Use Your Illusion II         24.8 millones
23 de noviembre de 1993 The Spaghetti Incident? 6 millones
23 de noviembre de 2008 Chinese Democracy        22 millones
23 de noviembre de 1999 Live Era                        13 millones

Luego poner un menú en que el usuario pueda escoger el método de búsqueda (Por año, por nombre o por ventas). Y al poner dicho dato le salgan los demás.
  
  Pistas:           Todo vale
  Ejemplo:         Un ejemplo sería, el usuario decide buscar  por año, inserta 1993 y seguidamente le sale;

Código:
23 de noviembre de 1993 	The Spaghetti Incident? 	6 millones de ventas

SUERTE
 ;-)


Título: Re: [Reto Batch]Buscame en el log
Publicado por: Binary_Death en 17 Julio 2012, 17:18 pm
¿La estructura del log ha de ser esa, o es libre?


Título: Re: [Reto Batch]Buscame en el log
Publicado por: Puntoinfinito en 17 Julio 2012, 17:26 pm
Libre, libre:)


Título: Re: [Reto Batch]Buscame en el log
Publicado por: Binary_Death en 17 Julio 2012, 18:31 pm
Aquí tienes  ;)

Código
  1. @echo off
  2. setlocal enableextensions enabledelayedexpansion
  3.  
  4. set "strpos=\<"
  5. 0<nul,more/c
  6. set/p "logfile=Log >> "
  7. if not exist "%logfile%" exit
  8.  
  9. :_main
  10. 0<nul,more/c
  11. echo: 1 - Search by year
  12. echo: 2 - Search by album
  13. echo: 3 - Search by sales
  14. set/p "opnum= >> " & echo+
  15. if %opnum% lss 1 goto :_main
  16. if %opnum% gtr 3 goto :_main
  17. call :_method[%opnum%]
  18. goto :_main
  19.  
  20. :_method[1]
  21. 0<nul,more/c
  22. set/p "year=Year >> "
  23. 1>nul,(echo.%year%|findstr /r "^[0-9]*$") || goto :_method[1]
  24. call :__search "%year%"
  25. pause 1>nul & goto :eof
  26.  
  27. :_method[2]
  28. 0<nul,more/c
  29. set/p "name=Album >> "
  30. 1>nul,(echo.%name%|findstr /i /r "^[a-z]*$") || goto :_method[2]
  31. set "strpos=" & call :__search "%name%"
  32. pause 1>nul & goto :eof
  33.  
  34. :_method[3]
  35. 0<nul,more/c
  36. set/p "sales=Number of sales >> "
  37. 1>nul,(echo.%sales%|findstr /r "^[0-9]*") || goto :_method[3]
  38. call :__search "%sales%"
  39. pause 1>nul & goto :eof
  40.  
  41. :__search
  42. set "ltok=.xyz"
  43. set "item=%%!ltok:~% style="color: #448888;">opnum%,1!"
  44. for /f "tokens=1,2,3 delims=# usebackq" %%x in (
  45. "%logfile%"
  46. ) do (
  47. 1>nul,(echo.%item%|findstr /i /r "%strpos%%~1.*") && (
  48. echo:%%x %%y %%z
  49. )
  50. )
  51. set "strpos=\<"
  52. goto :eof
  53.  

El log, tiene que tener los datos separados por #. Así:

Código:
21 de julio de 1987#Appetite for Destruction#60.00 millones
29 de noviembre de 1988#G N' R Lies#13.30 millones
17 de septiembre de 1991#Use Your Illusion I#26.40 millones
17 de septiembre de 1991#Use Your Illusion II#24.80 millones
23 de noviembre de 1993#The Spaghetti Incident?#6.00 millones
23 de noviembre de 2008#Chinese Democracy#22.00 millones
23 de noviembre de 1999#Live Era#13.00 millones

¡Un saludo!

EDIT: Ligeramente optimizado.


Título: Re: [Reto Batch]Buscame en el log
Publicado por: Puntoinfinito en 17 Julio 2012, 18:41 pm
Funciona;)

Yo hice uno que también funciona y es mucho más sencillo ; http://pastebin.com/x9SAfBgc

Y el log ha de contener esto;

Código:
21 de julio de 1987  -	Appetite for Destruction   -	60 millones de ventas
29 de noviembre de 1988    - G N' R Lies  - 13.3 millones de ventas
17 de septiembre de 1991   - Use Your Illusion I  - 26.4 millones de ventas
17 de septiembre de 1991   - Use Your Illusion II  - 24.8 millones de ventas
23 de noviembre de 1993    - The Spaghetti Incident?    - 6 millones de ventas
23 de noviembre de 2008    - Chinese Democracy    - 22 millones de ventas
23 de noviembre de 1999    - Live Era   - 13 millones de ventas

(Separados por un -)

Saludos





Título: Re: [Reto Batch]Buscame en el log
Publicado por: Binary_Death en 17 Julio 2012, 18:46 pm
Sí, así queda más sencillo.
Pero ten en cuenta que es muy práctico que diferencie los datos de lo que estás buscando. Por ejemplo, si con mi código pones:

Código:
21 de julio de 1987#Appetite for Destruction#17 millones
29 de noviembre de 1988#G N' R Lies#13.30 millones
17 de septiembre de 1991#Use Your Illusion I#26.40 millones
17 de septiembre de 1991#Use Your Illusion II#217.80 millones
23 de noviembre de 1993#The Spaghetti Incident?#6.00 millones
23 de noviembre de 2008#Chinese Democracy#22.00 millones
17 de noviembre de 1999#Live Era#13.00 millones

Fíjate. Tenemos en la primera línea 17 millones de ventas. Tenemos en la última línea "17 de noviembre", y por otro lado tenemos en la cuarta línea 217.80 millones de ventas.

Si buscamos 17 por ventas, en mi código aparecerá sólo la primera línea, que es la que tiene 17 millones de ventas en sí. En tú código aparecería la primera, la última y la cuarta.

Si buscamos 17 por fecha, en mi código aparecería sólo la última, en el tuyo todas... y así sucesivamente.

Otra cosa curiosa, es que en mi código si buscamos 17 por ventas, no aparecerá el 217 millones de ventas. Eso es práctico, porque no es lo mismo 17 que 217, mother of obvious.

En resumen, que sacrifiqué un poco de simplicidad por una mayor exactitud en la búsqueda  :P


Título: Re: [Reto Batch]Buscame en el log
Publicado por: Novlucker en 17 Julio 2012, 18:56 pm
Que pasa si se esta buscando por año, y el grupo tiene un disco que se llama como el año buscado.
Código:
21 de julio de 1987  -	Appetite for Destruction   -	60 millones de ventas
29 de noviembre de 1988    - G N' R Lies  - 13.3 millones de ventas
17 de septiembre de 1991   - Use Your Illusion I  - 26.4 millones de ventas
17 de septiembre de 1991   - Use Your Illusion II  - 24.8 millones de ventas
23 de noviembre de 1993    - The Spaghetti Incident?    - 6 millones de ventas
23 de noviembre de 2008    - 1999    - 22 millones de ventas
23 de noviembre de 1999    - Live Era   - 13 millones de ventas

Que pasa si busco año 1999? :P

Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.

Estaba comentando justamente eso


Título: Re: [Reto Batch]Buscame en el log
Publicado por: Binary_Death en 17 Julio 2012, 18:59 pm

En el caso de mi ejemplo, mostrará únicamente el álbum "Live Era", la última línea  :P


Título: Re: [Reto Batch]Buscame en el log
Publicado por: Puntoinfinito en 17 Julio 2012, 19:05 pm
Si, tienes toda la razon, mi code esta mal porque no se basa en un solo tema xD

Saludos


Título: Re: [Reto Batch]Buscame en el log
Publicado por: Binary_Death en 17 Julio 2012, 19:12 pm
Bueno... ahora falta ver más soluciones  :P se me ocurre otra, que es la que pensaba aplicar yo al principio.
Pista: dividir el log.

Fue por eso que te pregunté si se podía modificar la estructura, aunque al final no le hice gran cosa  :xD


Título: Re: [Reto Batch]Buscame en el log
Publicado por: Puntoinfinito en 18 Julio 2012, 16:50 pm
Adelante!