Nuevas NORMAS para el foro

Curso Hacker
Bienvenido(a), Visitante. Favor de ingresar o registrarse.
¿Perdiste tu email de activación? - Julio 26, 2008, 11:48:25
Boton Buscar
Inicio Ayuda Ingresar Registrarse
Visita: Articulos - Juegos Gratis - Da Foros

Comunidad Underground Hispana  |  Programacion  |  Programación  |  Batch (Moderadores: Espectro Infernal, The Shadow)  |  Tema: busqueda en archivo .txt 0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: [1] Ir Abajo Imprimir
Autor Tema: busqueda en archivo .txt  (Leído 167 veces)
El92rozn
Miembro
*****
Desconectado Desconectado

Mensajes: 135



Ver Perfil
« en: Julio 02, 2008, 07:59:50 »

 Muy wenas a todos!
ufff hacia mucho que no me pasaba por el foro,( ya veo pocos conocidos por aquí jeje), pero la verdad es que me he topado con un problemilla en un programa y me gustaría que me echaseis una manita!

a ver, tengo un archivo de texto (x.txt) en el que esta escrito algo así:

---------------------------------------------------------
fecha  hora
------------------
nombre: xxxxx
direccion: yyyy
tlf : zzzz
observaciones: hhhh
------------------
seccion: nnnn
---------------------------------------------------------
---------------------------------------------------------
fecha  hora
------------------
nombre: aaaa
direccion: bbbb
tlf : cccc
observaciones: dddd
------------------
seccion: eeee
---------------------------------------------------------
etc...

como veis es un archivo de almacenamiento de datos.

Bueno lo que me gustaría que me ayudaseis es a sacar un programa que mediante la introducción del dato "nombre=aaaa" por ejemplo, y con ayuda del FOR, consiguiese sacar la ficha completa  de ese nombre.

yo lo he estado intentando y la verdad es que de momento no he conseguido mas que sacar la linea completa de nombre...con este comando:

FOR /F "tokens=1 delims=" %%a IN ('FIND /I "xxxx" c:\c.txt') do echo %%a

Espero que podais ayudarme con este reto!
Muchas gracias y saludos a todos!!

el92rozn


« Última modificación: Julio 02, 2008, 08:55:19 por El92rozn » En línea


Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion
The Shadow
Moderadores
Colaborador
*****
Desconectado Desconectado

Mensajes: 754


Fucking mnemonic c0d1n6!

shadow@el-hacker.org
Ver Perfil Email
« Respuesta #1 en: Julio 02, 2008, 06:57:51 »

Weno amigo . . . en mi opinion personal . . . en el uso de bases de datos en batch . . . tienes que marcar cada entrada de la base de datos para luego manejarla . . . es decir . . tu base de datos tiene que ser como esta (por ejemplo):
------------------------fichero=bd.txt
Citar
xxxxx[---------------------------------------------------------
xxxxx[fecha  hora
xxxxx[------------------
xxxxx[nombre: xxxxx
xxxxx[direccion: yyyy
xxxxx[tlf : zzzz
xxxxx[observaciones: hhhh
xxxxx[------------------
xxxxx[seccion: nnnn
xxxxx[---------------------------------------------------------
aaaa[---------------------------------------------------------
aaaa[fecha  hora
aaaa[------------------
aaaa[nombre: aaaa
aaaa[direccion: bbbb
aaaa[tlf : cccc
aaaa[observaciones: dddd
aaaa[------------------
aaaa[seccion: eeee
aaaa[---------------------------------------------------------
etc...
------------------------fichero=bd.txt

esto es para marcar todo lo referente al nombre aaaa, para su posterior uso . . .

el programita seria:

...
Código:
set /p name=Nombre?
find /I "%name%["<bd.txt
...

O bien si lo quieres mas "bonito" seria algo como:

...
Código:
set /p name=Nombre?
set g=%name%_
FOR /F "tokens=* delims=," %%a IN ('find /I "%g%" bd.txt') do call :st %%a
pause&& exit
:st
set a=%1
echo set b=%%a:%g%=%%>$.cmd
call $.cmd
set b=%b:_= %
echo %b%&& goto :EOF
...

cabe destacar que de esta forma, la base de datos no podra tener caracteres restringidos ya que al pasarlos por el for, no coge todo lo que deberia ser . . . asi que el fichero de la bd deberia ser algo como:

Citar
xxxxx_---------------------------------------------------------
xxxxx_fecha__hora
xxxxx_------------------
xxxxx_nombre:_xxxxx
xxxxx_direccion:_yyyy
xxxxx_tlf_:_zzzz
xxxxx_observaciones:_hhhh
xxxxx_------------------
xxxxx_seccion:_nnnn
xxxxx_---------------------------------------------------------
aaaa_---------------------------------------------------------
aaaa_fecha__hora
aaaa_------------------
aaaa_nombre:_aaaa
aaaa_direccion:_bbbb
aaaa_tlf_:_cccc
aaaa_observaciones:_dddd
aaaa_------------------
aaaa_seccion:_eeee
aaaa_---------------------------------------------------------

y devolvera algo asi:

Citar
---------------------------------------------------------
fecha  hora
------------------
nombre: aaaa
direccion: bbbb
tlf : cccc
observaciones: dddd
------------------
seccion: eeee
---------------------------------------------------------

Saludos!
En línea


Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion





Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion
Reglamento del Foro
     Linux  Registered User #473016
El92rozn
Miembro
*****
Desconectado Desconectado

Mensajes: 135



Ver Perfil
« Respuesta #2 en: Julio 03, 2008, 02:26:43 »

Menuda respuesta Shadow! muchísimas gracias por tu rapidez y eficacia!!! la verdad es que me gustaría que me explicases un poco ese segundo código que me has dejado, al menos la parte después del For, que es donde me pierdo.

Código:
set /p name=Nombre?
set g=%name%_
FOR /F "tokens=* delims=," %%a IN ('find /I "%g%" bd.txt') do call :st %%a
pause&& exit
:st
set a=%1
echo set b=%%a:%g%=%%>$.cmd
call $.cmd
set b=%b:_= %
echo %b%&& goto :EOF

Muchísimas gracias por la ayuda y un saludito!!

el92rozn
En línea


Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion
The Shadow
Moderadores
Colaborador
*****
Desconectado Desconectado

Mensajes: 754


Fucking mnemonic c0d1n6!

shadow@el-hacker.org
Ver Perfil Email
« Respuesta #3 en: Julio 03, 2008, 09:58:17 »

Citar
FOR /F "tokens=* delims=," %%a IN ('find /I "%g%" bd.txt') do call :st %%a

el comando
Citar
find /I "%g%" bd.txt
, buscara todas las lineas que contengan la cadena
Citar
"%g%"
del archivo
Citar
bd.txt
; todas esas lineas seran analizadas con el
Citar
FOR
, el cual, cada linea la mandara a la funcion
Citar
:st
con el comando
Citar
call :st %%a
. La funcion
Citar
:st
se encargara de arreglar las lineas que le dan y mostrarlas...

Y no hay de que! . . . para eso estamos!

Saludos!
En línea


Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion





Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion
Reglamento del Foro
     Linux  Registered User #473016
El92rozn
Miembro
*****
Desconectado Desconectado

Mensajes: 135



Ver Perfil
« Respuesta #4 en: Julio 04, 2008, 03:25:36 »

muy bien, y muchísimas gracias! Ya lo estoy utilizando y funciona de maravilla!

un saludo!!

el92rozn
En línea


Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion
wizard_0
Miembro
*****
Desconectado Desconectado

Mensajes: 111


wizard_0_@hotmail.com
Ver Perfil Email
« Respuesta #5 en: Julio 04, 2008, 09:55:41 »

Weno  yo  lo  hice  mas   simple...  segun  el  nombre  q  digitase..  o  podria   hacerse  tambien  por  seccion  como  esta  en  tu  database.

base.txt

Código:
---------------------------------------------------------
fecha  hora
------------------
nombre: pedro
direccion: yyyy
tlf : zzzz
observaciones: hhhh
------------------
seccion: nnnn
---------------------------------------------------------
---------------------------------------------------------
fecha  hora
------------------
nombre: martha
direccion: bbbb
tlf : cccc
observaciones: dddd
------------------
seccion: eeee
---------------------------------------------------------


Código:
@echo off
Title BASE DE DATOS
set c=0
:inicio
cls
set /p n=Nombre :
type base.txt | find /I "%n%" && call:si
if %errorlevel% GTR 0 (call:info "El nombre: %n% ,no  figura  en  la  base de  datos" "     Por favor verifique el nombre" 16 "** ERROR!! **" )
pause
goto inicio

:si
cls
setlocal enabledelayedexpansion
for /f "tokens=1-2* delims=:" %%a in (base.txt) do (
if /I "%%b" EQU " !n!" (set c=1)
if !c! GTR 0 (
set /a c+=1
echo %%a:%%b
)
if !c! GTR 4 (set c=0)
)
goto:EOF

:info
echo wzr=%1 ^& Chr(13) ^& %2 >%temp%\winfo.vbs
echo msgbox wzr,%3,%4 >>%temp%\winfo.vbs
start %temp%\winfo.vbs
ping 127.0.0.1 -n 2 >nul
del %temp%\winfo.vbs >nul
goto:EOF


Si  le  pones  mArtHa  t d  vuelve  algo  asi...

Código:
nombre: martha
direccion: bbbb
tlf : cccc
observaciones: dddd

aunke  si  kieres  mas  lineas  de  tu  base  q  aparescan  solo  modificas  el  if  en  el  FOR..

salu2--> Afro
En línea

↑__P®egun†a__b!na®¡a__↑

3reS_un__[1]__ø__[0]__?¿?¿
        ø__vives__ø__mueres

Si__estas__v1vø_!!!__ganate__el__ saludo_!!!

"
Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion"
El92rozn
Miembro
*****
Desconectado Desconectado

Mensajes: 135



Ver Perfil
« Respuesta #6 en: Julio 05, 2008, 08:48:31 »

ola wenas, que tal todo?

weno he leído y estudiado a fondo tu respuesta wizard pero me resulta demasiado avanzada también para mis conocimientos de este lenguaje...me gustaría que me explicases un poquillo como funciona ya que quisiera comprenderlo del todo!

Otra cosilla que os quería preguntar...bien imaginemos que tenemos diferentes archivos (que llamaremos bd.txt ) en diferentes carpetas (que llevaran el nombre de la sección a la que pertenecen, como por ejemplo, "cines" o "restaurantes"). En cada carpeta de sección existe un bd.txt en el que se disponen todos los datos.

weno la pregunta es, como se podría hacer una búsqueda en toda la base de datos? es decir, como encontrar por ejemplo un nombre en todas las bd.txt de todas las secciones??

yo he pensado en realizar una copia de cada bd.txt de cada sección en un txt (que llamaría por ejemplo bdgeneral.txt) donde después se realizaría la búsqueda pero no se muy bien como hacerlo
 
espero haberme explicado correctamente y que me podáis ayudar porque la verdad es que estoy un poco perdido...!

Un saludo y gracias

El92rozn
« Última modificación: Julio 05, 2008, 11:06:38 por El92rozn » En línea


Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion
wizard_0
Miembro
*****
Desconectado Desconectado

Mensajes: 111


wizard_0_@hotmail.com
Ver Perfil Email
« Respuesta #7 en: Julio 05, 2008, 07:17:09 »

Con   el  for  podes  agarrar  mas  de  un  archivo...  si  lo deseas....   podes  comensar  con  uno  y  seguir  hasta  terminar...

ejemplo:

Código:
For /f  %%a in (db1.txt db2.txt db3.txt dbgeneral.txt) do (echo  has  lo tuyo)

weno  weno  trabajarias  uno  por  uno
y  esta  linea  t  dice  si   exist  el  nombre  en  todo  el  archivo...

type base.txt | find /I "%n%" && call:si  -->  Ssi  se  encuentra  el  nombre  llamas  a  la  etiketa  "si"

Me  gustaria   q  me  digas  q  partes  del  code..  no  entendes..  por  q no  creo  q  sea  todo  noO?

salu2-->
En línea

↑__P®egun†a__b!na®¡a__↑

3reS_un__[1]__ø__[0]__?¿?¿
        ø__vives__ø__mueres

Si__estas__v1vø_!!!__ganate__el__ saludo_!!!

"
Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion"
El92rozn
Miembro
*****
Desconectado Desconectado

Mensajes: 135



Ver Perfil
« Respuesta #8 en: Julio 06, 2008, 06:39:39 »

gracias por la info, voy a ponerme ahora mismo a hacer pruebas a ver que consigo!
lo que no entiendo del código que me dejaste es lo siguiente:

Código:
:si
cls
setlocal enabledelayedexpansion
for /f "tokens=1-2* delims=:" %%a in (base.txt) do (
if /I "%%b" EQU " !n!" (set c=1)
if !c! GTR 0 (
set /a c+=1
echo %%a:%%b
)
if !c! GTR 4 (set c=0)
)
goto:EOF

:info
echo wzr=%1 ^& Chr(13) ^& %2 >%temp%\winfo.vbs
echo msgbox wzr,%3,%4 >>%temp%\winfo.vbs
start %temp%\winfo.vbs
ping 127.0.0.1 -n 2 >nul
del %temp%\winfo.vbs >nul
goto:EOF

espero que me puedas explicar un poquito esto!

un saldo y muchísimas gracias por toda la ayuda que me estais aportando.

el92rozn
En línea


Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion
El92rozn
Miembro
*****
Desconectado Desconectado

Mensajes: 135



Ver Perfil
« Respuesta #9 en: Julio 06, 2008, 09:17:33 »

weno al final, pensando un poquito, he llegado a otro método para realizar la busqueda general:
Código:
type seccion1/base.txt > c:\basegeneral.txt
type seccion2/base.txt >> c:\basegeneral.txt
type seccion3/base.txt >> c:\basegeneral.txt
así hacemos un archivo general donde se van metiendo los datos de cada base.txt

Después solo tendremos que hacer una búsqueda con FOR en basegeneral.txt para encontrar los resultados.

Un saludo

el92rozn
En línea


Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion
wizard_0
Miembro
*****
Desconectado Desconectado

Mensajes: 111


wizard_0_@hotmail.com
Ver Perfil Email
« Respuesta #10 en: Julio 06, 2008, 11:18:49 »

my friend   no  salio  lo q  postee  anteriorment  acerca  de  esta  busqueda  general  q  pensas  hacer...   t  decia  q   con  el  for  podes  hacerlo..  asi  mira.

For /f %%a in (base1.txt base2.txt base3.txt) do (echo has lo tuyo)


y  respecto  a las  partes   del  code  q  no  entendes...
aki  t  explico  aunk  no  c  explicar  muy  bien... Roll Eyes

:si
cls
setlocal enabledelayedexpansion
::: para  habilitar  la  expansion de  tus  variables  y  seguir  trabajando  con  ellas ::::
::::::::  esta  configuracion dura   hasta   q  tu  colokes  ENDLOCAL :::::::::

for /f "tokens=1-2* delims=:" %%a in (base.txt) do (
if /I "%%b" EQU " !n!" (set c=1) --->  Si la  segunda  cadena  es =  a  el  nombre  q digitast por  teclado
if !c! GTR 0 (    --> Si contador  es  mayor  q  cero
set /a c+=1
echo %%a:%%b
)
if !c! GTR 4 (set c=0)  --> Si contador  es  mayor  q  4  por  q  son  4  lineas  q  vamos  a  obtener  de  la   base.txt
)
goto:EOF


::  POR  ultimo  esto  es  solo  visual b  creando  un  Script  para  mandar  un  mensaje  de  alerta  o  confirmacion..  para   q  sea  algo  mas  elegant  lo  puse  ::::

:: weno  los  parametros  q  entran  en  esta  etiketa  son  d  tipo  String  el  %1 %2  ::
::  el  %3  es el  tipo  de  mensaje   q  vas  a  mostrar  pued  ser  una  intruccion  al modo  de  ERROR  como  VBCRITICAL  q  es  lo  mismo  q  poner  16=VBCRITICAL ::
:: el  %4  es  el  titulo  del  mensaje  q  es  d  tipo String :::

:info
echo wzr=%1 ^& Chr(13) ^& %2 >%temp%\winfo.vbs
echo msgbox wzr,%3,%4 >>%temp%\winfo.vbs
start %temp%\winfo.vbs
ping 127.0.0.1 -n 2 >nul
del %temp%\winfo.vbs >nul

salu2--> Afro
En línea

↑__P®egun†a__b!na®¡a__↑

3reS_un__[1]__ø__[0]__?¿?¿
        ø__vives__ø__mueres

Si__estas__v1vø_!!!__ganate__el__ saludo_!!!

"
Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion"
El92rozn
Miembro
*****
Desconectado Desconectado

Mensajes: 135



Ver Perfil
« Respuesta #11 en: Julio 07, 2008, 02:16:32 »

ok wizard! después de probar tus códigos y de leer detenidamente las explicaciones veo claramente el funcionamiento de esto! Wink
Muchas gracias por vuestro tiempo, me habéis resultado de gran ayuda!

Un saludo y gracias

el92rozn
En línea


Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion
Páginas: [1] Ir Arriba Imprimir 
Comunidad Underground Hispana  |  Programacion  |  Programación  |  Batch (Moderadores: Espectro Infernal, The Shadow)  |  Tema: busqueda en archivo .txt « anterior próximo »
Ir a:  


Ranking-Hits
Powered by SMF 1.1.5 | SMF © 2006-2007, Simple Machines LLC