![]() |
Base TXT de Datos
¿Cómo encarar la siguiente mínima Base de Datos de Alumnos, datos recuperados de un archivo TXT?
Quiero evitarme dependencias de Base de Datos, SQL, etc, ya que el objetivo es recuperar y mostrar solamente Datos y notas de Alumnos desde un archivo TXT, pues los mismos no rebasan de una cantidad de 100 elementos, y estos Datos no serán modificados, ni renombrados, ni agregados, ni nada por el estilo, SON FIJOS de una Gestión pasada. La idea es la siguiente: ID...Apellido.....Nombre....Curso....Nota1.....Nota2....Nota3 01....Álvarez........David........1ro........43...........55........90 02....Oropeza.......Jorge........4to........67...........36........80 03....Camacho......Pedro........2do.......33...........75........20 04....Álvarez........Andrés.......1ro.......58...........65........40 05....Miranda........María........3ro........80...........22........30 06....Pérez...........Henry........4to.......77...........59........90 07....Campero......Joanna.......2do.......34...........96........50 08....Ruiz.............Lucy.........1ro........43...........60........70 ........ 100.....etc., etc. Pensaba, recuperarlo en Delphi con: No sé si estoy encarando bien esta parte o existe otro mejor camino, pues para 100 datos no vale la pena como dije depender de una Base de Datos. ¿Que opinan al respecto? Mis preguntas: 1- ¿Cómo mostrar en un TListBox un FILTRO de "Curso", donde solo me muestren los "ID"?, es decir por ejemplo para mostrar los ID de "1ro", el resultado en el TLIstBox debería ser: 01 04 08 2- Que si selecciono por ejemplo en el TListBox "01" en 3 TEdits que tengo en el Form me muestre de "01" sus valores= Nota1 (TEdit1), Nota2 (TEdit2), Nota3 (TEdit3) 3- Y lo más complicado (me parece) mostrar los "ID" en el TListBox con el FILTRO de "Curso" pero que obedezcan a una ORDENACIÓN de "Nombre". El resultado debería ser: 04 01 08 Disculpen si es demasiado sencillo la pregunta, o tal vez me digan mejor si es con SQL (no me concozco bien) pero me estoy haciendo un bollo con los algoritmos y funciones. Agradeceré vuestra ayuda. Un Saludo |
Te recomiendo que utilices ADO para acceder al fichero de texto; Utilizandolo puedes trabajar con ficheros de texto con Columnas de ancho fijo y columnas delimitadas.
Para mí la ventaja de hacerlo así es que accederás al fichero como si fuera una Base de Datos; Eso te facilitará algunas operaciones e incluso podrás utilizar componentes de B.D. Para Columnas de Ancho fijo puedes utilizar esta ConectionString: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\txtFilesFolder\;Extended Properties="text;HDR=Yes;FMT=Fixed"; Para las delimitadas esta: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\txtFilesFolder\;Extended Properties="text;HDR=Yes;FMT=Delimited"; |
He intentado con la sugerencia del ADO, y no puedo recuperar mi Tabla TXT, no estoy bueno con componentes de Base de Datos espero comprendan; he colocado 2 componentes en mi formulario TADOConnection y TADOTable; en la propiedad ConnectionString del TADOConnection he puesto como se dijo (cambiando obviamente: c:\txtFilesFolder\) y en TADOTable en la propiedad Connection selecciono ADOConnection1, en la propiedad TableName me aparecen varios archivos de la elijo MiTabla#TXT (eso de # no sé si está bien), le doy doble click a TADOTable y la tabla está vacía. He tomado como ejemplo el siguiente TXT:
Producto,Cantidad,Precio Sierra eléctrica,1,250 Machete,5,2.70 Detergente,1,10 Delantal,2,7.25 Afilador,3,5 ¿Que estoy haciendo mal para recuperar la tabla? ¿Que me falta? Cita:
|
Acabo de hacer la prueba con el ejemplo que pones, usando la segunda cadena de conexión que puso Neftali, y me ha funcionado bien. ¿Has activado la tabla luego de escoger el txt?
// Saludos |
Pues yo, una vez de utilizar componentes de base de datos, los datos los metería en una tabla, así estarían mas protegidos y cualquier acción de filtro, ordenado etc. sería mucho más fácil.
Un Saludo. |
1 Archivos Adjunto(s)
Un ejemplo de cómo configurarlo.
Puedes abrir el fichero, e incluso ordenar. NOTA: He cambiado las "comas" por "puntos y comas" |
Cita:
Me basé en la premisa de hacerlo sobre un TXT, pero si hay posibilidad, yo pasaría los datos a una tabla de DBase (por ejemplo) que se puede acceder igualmente utilizando ADO sin necesidad de BDE, simplemente cambiando la conexión. En ese caso la dependencia es mínima (sólo las MDAC), pero eso pasa también con el TXT. |
Hola,
Acabo de leer los post, y espero no esté demás aclararles que no tengo conexión a Internet en Casa, por lo que me valgo de un CyberCafe-Internet, y mas tarde probaré el ADO y TXT.zip de Neftali. Seguí trabajando en el asunto, y ahora he colocado ADOConnection, ADOTable, DataSource1, DBGrid en mi tabla, si bien recupera el archivo TXT, este no me muestra en Columnas, sino que cada fila se parece IGUAL a lo que está en el texto, por ejemplo la primera fila de Tabla me muestra: Producto,Cantidad,Precio (una sola columna con ese texto) ¿Que parte habré hecho mal? Como no tengo Delphi a mano, mas tarde revisaré el ADO y TXT.zip Luego buscando en el Foro encontré sugerencias de trabajar con TStringList ¿Que sugerencia me dan para utilizar este componente? Pues como en un principio hablé, no editaré la Base de Datos, ni renombraré, ni borraré, ni adicionaré, nada. El único objetivo es Manejar esa Base de Datos (realizar filtros, ordenaciones) luego mostrarlos en un TMemo, TListBox, etc o las notas en TEdits, y preferí un archivo TXT para encriptarlo y esté segura mi Base de Datos. |
Cita:
Como ya he dicho más arriba, si sustituyes las , por ; ==> Arreglado |
Cita:
Según entiendo, debería poder especificarse el separador poniendo: Extended Properties="text;HDR=Yes;FMT=Delimited(x)" donde x es el separador a usar. Pero hasta ahora no he tenido éxito. // Saludos |
Gracias Neftali,
He probado el ejemplo y está muy bueno, auque esto de ADO y Base de Datos no me las conozco muy bien, me voy a ir interiorizando al respecto buscando información. ¿Por qué elegiste el delimitador (;() y no (,)? ¿Que no acepta comas? ¿Se puede usar otros delimitadores, por ejemplo guiones? ¿como?. A diferencia de Román como a mi en un principio NO me aceptaba las comas. Ordena bien el DBGrid en tu ejemplo, ¿Puede también FILTRAR? Como dije en mi último post, lo único que deseo es administrar esa base de datos ya que no cambiaré ni aumentaré nada. Para mi ejemplo me gustaría saber cómo filtrar por "Apellidos" ya sea en el mismo DBGrid (aunque sería mejor MOSTRARLO en otro componente que Yo desease, por ejemplo en un TListBox o en un TMemo o en TEdits u otros) para que no se vean tan planos como lo muestra el TDBGrid. En conclusión quiero enfocar esta situación de que filtre o saque promedios de notas, todo internamente, y con un botón mostrar en otros objetos como dije para que no se vean tan planos. Seguiré atento a nuevas sugerencias. |
Yo sigo sin entender por qué en unos casos acepta las comas y en otros no. El ejemplo de Neftali me funciona si cambio por comas pero no si dejo los ;.
Según he seguido leyendo, hay dos maneras de especificar el formato:
En el primer caso, los parámetros se especifican en la entrada HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Text Ahí, entre otras cosas, puede verse el campo Format con su valor por defecto: CSVDelimited, que es el que usa comas. Otros valores posibles para el campo Format son:
Y, en efecto, si pongo como valor de Format a Delimited(;), me funciona el ejemplo de Neftali. Se puede usar cualquier otro separador, excepto las comillas dobles. Si no se quiere alterar el registro, se pueden usar un archivo schema.ini que se localice en la misma carpeta que el archivo con los datos. schema.ini, será un archivo INI con una sección por cada archivo de texto que deseemos usar. Así, por ejemplo, si el archivo es datos.txt, entonces schema.ini deberá tener la sección Código:
[datos.txt] Según entiendo también, este archivo schema.ini es el que debemos usar para especificar las longitudes de los campos en el caso de que usemos columnas de ancho fijo (primera cadena que puso Neftali) en lugar de con separadores. El formato del archivo schema.ini para estos casos, así como el resto de lo que escribí, se puede ver en http://msdn.microsoft.com/library/de...ng03092004.asp // Saludos |
1 Archivos Adjunto(s)
Pues lo has explicado "de perlas" Roman.
Un ejempillo, que muestra el separador actual del registro. |
Pero aún no entiendo porqué a ti te funciona con ;. ¿Tienes CSVDelimited en el registro?
// Saludos |
Cita:
Format = Delimited( ; ) |
¿Y ese era el valor por defecto o tú se lo cambiaste en algún momento?
// Saludos |
Cita:
Cita:
Manualmente no lo he cambiado; Si se ha cambiado en algun momento durante "los ultimos 3 años de vida de mi Windows" (es el tiempo que hace que no reinstalo) lo desconozco. |
Al igual que Roman, Yo también no comprendo esa parte, pero lo que más me llamó la atención sobre los delimitadores es lo siguiente, ¿Mi Base de Datos TXT estará sujeta también a la dependencia de los Delimitadores que tenga una máquina?, es decir si tienen en otro Equipo en su Registro el Delimitador "coma" o suponiendo "comillas" por ejemplo, ¿entonces mi TXT (mi BD) no servirá, no se abrirá?? y mi aplicación no trabajará?
¿O habría alguna forma de FORZAR mediante código a que lea únicamente "punto y coma" como viene en el TXT? (ejemplo de Neftali) Bueno por el otro lado aun me quedé con aquella duda si se puede filtrar la Base de Datos, digamos todos aquellos que coincidan en CANTIDAD = 1 del ejemplo. ¿Es la propiedad FILTER que debo utilizar? Alguien mas puede ayudarme por favor |
1 Archivos Adjunto(s)
Cita:
Entiendo que la variable del registro es como si fuera el valor por defecto; El que tiene prioridad es el que se define en ese fichero. Subo el ejemplo con un fichero de esquema. En mi registro está el ; En el fichero de Datos.txt he usado el - Especificando en el fichero Schema.ini el - funciona perfectamente. Cita:
|
Vaya!
Hasta que al fin utilizaré mi primer INI desde que programo. Gracias Neftali. ¿Los INIs no son vulnerables y propensos a ser cambiados, editados o alterados? Esto podría ocasionar que la Aplicación funcione mal verdad? ¿Se puede encriptar o no tendría sentido de INI? ¿Cómo protegerlo? |
Cita:
Vulnerable, no se. Tan fácil es abrir el INI con el notepad, como abrir el EXE con el notepad. Si cambias algo y grabas, en ambos casos dejará de funcionar. Cita:
Creo que no tiene sentido proteger este fichero. Si alguien lo toquetea la aplicación funcionará mal, pero es que si borran el EXE también funcionará mal, y si cambian el Datos.txt también y si borran cualquiera de ellos también,... |
Otra variante
Cita:
Un posibilidad que me gustaría consultaros, y que creo que podría ser, en parte, la solución para el problema que plantea aquí Deiv, es la de generar el fichero *.ini al iniciar el programa, y que se borre al cerrarlo. Me explico, con la solución, tal y como está ahora, se distribuye el fichero *.ini con la aplicación, y como dice Deiv, la pueden cambiar (accidentalemente o por malas artes). Encriptarlo o protegerlo creo que requiriría muchas líneas de código, y no es un material tan "privado" que merezca la pena, ¿no? Tal y como dice Neftali... Cita:
Por otra parte, al salir, se puede eliminar el fichero por código, así quitamos basurilla al equipo del usuario, no dejamos pistas, y no modificamos su configuración personal. Además es más facil de distribuir la aplicación final, porque sólo con el ejecutable sirve. Por si fuera poco, aunque toquiteen el fichero *.ini mientras corre la aplicación, ya no importará. Además, será borrardo y generaremos uno nuevo y correcto cuando volvamos a ejecutar el programa. No hablo por experiencia, pero creo que no es complicado generar ese fichero, ya que es un fichero de texto plano ascii, con una extensión de terminada. Y para borrarlo... como sabemos donde esta y como se llama, creo que tampoco debería ser mucho problema. Bueno, creo que me he extendido demasiado. Pero ahí dejo la idea (o la tontería, que juzguen los expertos;) ). Suerte! |
Cita:
Similar para borrarlo al salir. |
Me alegra saber que no era una tontería.
Por otra parte, y con la idea de Neftali de usar un Memo, se puede complicar la cosa y dar opciones al usuario, permitiéndole que elija, mientras corre la aplicación, entre separar por comas, punto y coma, comillas, guiones,... Simplemente se puede cambiar el contenido del memo con lo que elija el usuario, y se vuelve a generar el fichero *.ini con la nueva configuración. Otra utilidad que se me ocurre aplicando la idea de Neftali es permitir al usuario importar ficheros con otro tipo de separadores. Por ejemplo, nuestra aplicación abre ficheros separados por ";", pero resulta que nos envian, conseguimos o lo que sea un fichero exportado de excell con ",". De esta manera, se puede seleccionar el separador, regenerar un *.ini, cargar el fichero y volver a las opciones iniciales. Es más complicado, pero por ideas que no quede. Por curiosidad... ¿cómo se haría para borrarlo? |
Si únicamente se requiere configurar el separador, yo mejor optaría por alterar por código esa entrada del registro y restaurarla al terminar.
// Saludos |
Cita:
|
Personalmente prefiero no trastear en el Registro. Primero porque me es más incómodo y segundo, porque me he encontrado ya varias veces, que segun cómo estén configurados los usuarios en los sistemas windows, no tienen permisos para leer y/o escribir en el registro.
También he de decir que en TS, también me han dado problemas de acceso los ficheros .INI; Al final tuvimos que renombrarlos a ".ISI" |
Creo que ando medio dormido. ¿Qué es TS?
// Saludos |
Cita:
Perdón, que no se en qué estaba pensando. Con TS me refería a Terminal Server (que es como a menudo trabajamos), pero eso no tiene nada que ver con lo que hablábamos. Los permisos de los usuarios, son los permisos en todos sitios. |
buenas
se que ha pasado algun tiempo desde el ultimo post, pero tengo un problema muy similar que me seria de gran utilidad si alguien me puede ayudar...
se trata de un archivo txt, 1. La informacion no esta seaparada por ningun tipo de delimitador, 2. Todas las lineas tienen un largo de 200 caracteres, 3. La primera (datos especificos de identificacion del archivo)y la ultima linea (datos de cierre) tienen la misma longitud pero hacen referencia a 2 tablas diferentes, con campos diferentes, todas las lineas de en medio(minimo 1) hace referencia a un detalle... 4. El encabezado esta compuesto por 4 valores de 50 de longitud cada uno 5. Los detalles(lineas de en medio) estan compuestos por 10 valores de de 10 de largo cada uno. 6. El detalle de cierre esta compuesto por 5 valores de 40 de longitud cada uno No existe nigun problema en que se divida en 3 diferentes grid a la hora de presentar la informacion, y luego debo ingresar esos valores a 3 tablas de bases de datos correspondientes, pero una vez teniendolas en un dbgrid, eso eslo de menos... el problema es que aun no logro vizualizar una manera de ahcerlo, aunque este tema me ha sido de mucha utilidad, para por lo menos tener una idea de como poder empezar, pero me trabe en el uso de
Pero es solo me serviria para la primera fila (encabezado)... estoy tirando lineas, para ver como podria resolverlo, pero agradesco muchisimo cualquier ayuda |
Así leido un poco rápido, me parece que no tienes de otra que separar el archivo en encabezado y detalles y tratar cada uno como aquí se indica.
// Saludos |
???
puedo tener mas de un 'Schema.INI'?
|
No, no. A eso me refiero. Tendrías que separar el archivo original en varios y usar un schema para cada uno. Quizá no estoy entendiendo bien. ¿Podrías poner un ejemplo de datos?
// Saludos |
aca esta
Lo modifique para variar su tamano y que sea mas facil de visualizar
Cita:
siguen los detalles que podrian ser N y un Final... cada linea es de 200 caracteres origianlmente y se parsea segun corresponde al detalle,encabezado o final... ya lo parseo bien con los detalles, pero como el ancho de columna no es la misma para todos los campos, debo parsear el tamano por aparte para el encabezado y para el final... |
ok ya logre solventar mi problema
1. Trabajo un archivo definido por columnas separada por tabuladores.. 2. Estoy trabajando con Delphi 2010... 3. Ingreso los datos depues de realizar varias operaciones, a una base de datos pero tengo un pequeno gran problema, necesito abrir el archivo de Datos de un fichero que el usuario me indique, y no de un fichero fijo... osea en lugar de que sea DATOS.txt utilizar un open dialog Cita:
cuando lo cargo de esta manera no me respeta las columnas, el separador ni nada de lo que contiene el archivo schema.txt podria venir por el lado del encabezado delfichero schema [datos.txt]... es correcto? como podria variarlo? no daria problemas por que lo cargo en el form create? |
buenas
ya resolvi mi problema... apunto el codigo por sialguien se le presenta una situacion similar
espero les sea de beneficio,y pos que sirva como una incorporacion al codigo de Neftali... |
La franja horaria es GMT +2. Ahora son las 09:31:27. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi