[Reto Batch]Buscame en el log

Iniciado por Puntoinfinito, 17 Julio 2012, 12:31 PM

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

Puntoinfinito

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
 ;-)
AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.

Binary_Death

¿La estructura del log ha de ser esa, o es libre?

Puntoinfinito

AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.

Binary_Death

#3
Aquí tienes  ;)

Código (dos) [Seleccionar]

@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.

Puntoinfinito

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



AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.

Binary_Death

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

Novlucker

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
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Binary_Death


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

Puntoinfinito

Si, tienes toda la razon, mi code esta mal porque no se basa en un solo tema xD

Saludos
AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.

Binary_Death

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