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;
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;
23 de noviembre de 1993 The Spaghetti Incident? 6 millones de ventas
SUERTE ;-)
¿La estructura del log ha de ser esa, o es libre?
Libre, libre:)
Aquí tienes ;)
@echo off
setlocal enableextensions enabledelayedexpansion
set "strpos=\<"
0<nul,more/c
set/p "logfile=Log >> "
if not exist "%logfile%" exit
:_main
0<nul,more/c
echo: 1 - Search by year
echo: 2 - Search by album
echo: 3 - Search by sales
set/p "opnum= >> " & echo+
if %opnum% lss 1 goto :_main
if %opnum% gtr 3 goto :_main
call :_method[%opnum%]
goto :_main
:_method[1]
0<nul,more/c
set/p "year=Year >> "
1>nul,(echo.%year%|findstr /r "^[0-9]*$") || goto :_method[1]
call :__search "%year%"
pause 1>nul & goto :eof
:_method[2]
0<nul,more/c
set/p "name=Album >> "
1>nul,(echo.%name%|findstr /i /r "^[a-z]*$") || goto :_method[2]
set "strpos=" & call :__search "%name%"
pause 1>nul & goto :eof
:_method[3]
0<nul,more/c
set/p "sales=Number of sales >> "
1>nul,(echo.%sales%|findstr /r "^[0-9]*") || goto :_method[3]
call :__search "%sales%"
pause 1>nul & goto :eof
:__search
set "ltok=.xyz"
set "item=%%!ltok:~%opnum%,1!"
for /f "tokens=1,2,3 delims=# usebackq" %%x in (
"%logfile%"
) do (
1>nul,(echo.%item%|findstr /i /r "%strpos%%~1.*") && (
echo:%%x %%y %%z
)
)
set "strpos=\<"
goto :eof
El log, tiene que tener los datos separados por #. Así:
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.
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;
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
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:
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
Que pasa si se esta buscando por año, y el grupo tiene un disco que se llama como el año buscado.
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
En el caso de mi ejemplo, mostrará únicamente el álbum "Live Era", la última línea :P
Si, tienes toda la razon, mi code esta mal porque no se basa en un solo tema xD
Saludos
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
Adelante!