Cargar datos de un TXT a un TDataset (utilizando ADO) – Parte 2
Continuando con esta entrada (parte 1), nos queda ver como hacer algo similar, pero con un archivo de texto cuyos datos están separador utilizando algun caracter especial (TAB, coma, punto y coma,…)
Por defecto, para la lectura de un fichero de texto medianto ADO (Jet 4.0) se utiliza la información que hay en el registro de windows, que se considera la configuración por defecto. Esta configuración se encuentra en la clave:
‘\SOFTWARE\Microsoft\Jet\4.0\Engines\Text’
Dentro de HKEY_LOCAL_MACHINE y en el valor Format.
De todas formas, para tener un mayor control sobre el procesos para acceder a los datos del fichero de texto, es recomentable (altamente recomendable diría yo) crear un fichero de esquema.
El fichero de esquema siempre tienen el nombre schema.ini y se encuentra en la misma carperta del origen de datos. En el fichero de esquema se definen:
- El formato del archivo.
- El nombre, la longitud y el tipo de cada campo (columnas).
- El juego de caractreres utilizado en el archivo de datos.
- Conversiones especiales para los tipos de datos.
Si tuviéramos un archivo similar a este (aunque aquí he utilizado para el ejemplo el separador ‘–‘ que no parace muy adecuado):
Sierra eléctrica-1-250 Machete-5-2.70 Detergente-1-10 Delantal-2-7.25 Afilador-3-5 Cortacesped-6-95 Televisor plasma-2-200 Caja clavos-4-12 Ordenador-1-300 Caja lápices-2-11 Paquete folios-1-10 |
En nuestro archivo schema.ini debemos añadir lo siguiente para conseguir un acceso correcto a los datos:
- Format=Delimited(-); Para definir nuestro separador de campos
- ColNameHeader=False; Puesto que no están definidas dentro del archivo de texto los títulos de las columnas.
- A continuación nombres y tipos de las columnas.
- CharacterSet=ANSI; Para definir la codificación del texto.
- MaxScanRows=0; Define cuantas líneas escanea el motor para determinar el tipo de datos de cada columna. 0 para todas.
Finalmente nuestro archivo de esquema quedará de compleatado de la siguiente manera:
[Datos.txt] Format=Delimited(-) ColNameHeader=False Col1=Producto char Col2=Cantidad Integer Col3="Precio Total" currency MaxScanRows=0 CharacterSet=ANSI |
El ejemplo completo para acceder a los datos de un TXT utilizando las opciones del Registro de Windows, se pueden descargar desde aquí.
<Descargar ejemplo>
El ejemplo completo para acceder a los datos de un TXT utilizando las opciones de un archivo de esquema schema.ini, se pueden descargar desde aquí.
<Descargar ejemplo>
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
Hola Neftalí, necesito saber como arrastrar un documento X al un grid y sólo me de la direccón en donde se encuentra en el Campo deseado..
ejemplo yo tengo algunos documentos pdf en c:\Datos\… deseo arrastrar 4 de ellos y soltarlos sobre el DBgrid (enlazado a una Mamtable) y me de su ubicacion en el campo direccion osea seria c:\datos\doc.pdf …etc… tienes alguna idea como lograr eso?? me puedes orientar!! gracias!!
P.D. excelente página!!
Para este tipo de dudas te recomiendo los foros del ClubDelphi:
http://www.clubdelphi.com
No sólo para hacer la pregunta donde hay mucha gente que te puede ayudar, sino también para buscar respuestras. Si haces una búsqueda en los foros llegarás a este hilo:
http://www.clubdelphi.com/foros/showthread.php?t=54696
Donde se explica (cón código) cómo hacer lo que necesitas.
Un saludo.
Estimado Neftali, a traves de club delphi te hice una consulta para exportar excel a delphi, pero con este ejemplo de tu pagina pude hacerlo a traves de un txt, muchas gracias por tu constante aporte a mi aprendizaje.
@cecidvs
De nada.
Esbueno saber que determinadas cosas se son útiles a alguien.
Un saludo.
Tengo problemas para abrir un excel mediante una conexión ADO utilizando sql, el archivo lo puedo abrir como tabla directa pero no como sql, podrias ayudarme, gracias
@walter aguero
Para este tipo de dudas te recomiendo los foros del ClubDelphi:
http://www.clubdelphi.com
No sólo para hacer la pregunta donde hay mucha gente que te puede ayudar, sino también para buscar respuestas.
Un saludo.
hola,como puedo leer un archivo de texto separado por tabuladores y mostrarlo en php
@lupis
Hola Lupis.
Deberás hacer esta pregunta en algun lugar específico para PHP.
Por ejemplo aquí:
http://www.clubdelphi.com/foros/forumdisplay.php?f=15
En eso no puedo ayudarte.
Un saludo.
como hiciera para ver los tipos de valores que me aguantaria este fichero Schema…
digo podria poner campos tipo boolean? o bits? talvez… eso por dar un ejemplo
@Wbarrantes
En el fichero de Schema.ini, puedes especificar los tipos de datos que necesites:
* Bit
* Byte
* Short
* Long
* Currency
* Single
* Double
* DateTime
* Text
* Memo
* ODBC data types Char (same as Text)
* Float (same as Double)
* Integer (same as Short)
* LongChar (same as Memo)
* Date date format
Puedes ver los tipos y cómo especeificarlos en este link:
http://msdn.microsoft.com/en-us/library/ms709353%28VS.85%29.aspx
Un saludo.
@Germán Estévez
Muchas gracias Neftali… una pregunta mas… en tu ejemplo si quisiera agragar un boton para buscar elarchivo especificandolo yo,(en ves de ser el archivo contenido dentro de la misma carpeta con el nombre Datos.txt, acceder un archivo el que sea por medio de un open dialog)…
estoy provando de esta manera…
//**********************************************
OpenDialog1.Filter:=’Datos (*.txt)|*.txt’;
if OpenDialog1.Execute then
begin
if OpenDialog1.FileName emptystr then
begin
ADOTable1.Active := False;
ADOTable1.TableName:= OpenDialog1.FileName;
ADOTable1.Active := True;
showmessage(‘llego bien’);
end;
end;
//**********************************************
pero solo lo carga correctamente cuando utilizo un archivo que este dentro de la misma carpeta y con el nombre DATOS.txt…
@Wbarrantes
Resuelto…
apunto el codigo por aquello de que a alguien mas le sirva…
var
TSTR_Archivo:tstringlist;
begin
TSTR_Archivo:= tstringlist.Create;
//****************************************
OpenDialog1.Filter:=’Datos (*.txt)|*.txt’;
if OpenDialog1.Execute then
begin
if OpenDialog1.FileName emptystr then
begin
STR_FILE_NAME := OpenDialog1.FileName;
//abro el schema, lo modifico con el nombre del archivo y lo guardo
TSTR_Archivo.LoadFromFile(GetCurrentDir + ‘\Schema.ini’);
TSTR_Archivo[0] := ‘[‘+ExtractFileName(OpenDialog1.FileName)+’]’ ;
TSTR_Archivo.SaveToFile(GetCurrentDir + ‘\Schema.ini’);
// asigno el nombre del archivo a la conexion
ADOTable1.Active := False;
ADOTable1.TableName:= STR_FILE_NAME ;
ADOTable1.Active := True;
showmessage(‘llego bien’);
end;
end;
ahora probando la aplicacion de este ejmplo con un archivo que tengo que cargar, me genera un error(carga los titulos de las columnas pero sin ningun valor, osea en blanco), pero si copio el contenido del archivo en el archivo datos.txt original… no me da problema alguno…
tiendo a creer que el problema podria venir por el lado del ANSI, pero en lugar del ansi que valores puedo poner (digo por ejemplo UTF8 o UTF-8, ya probe ambos pero me da «error no esperado»)…
agradesco la ayuda al respecto…
ya me funciono con UNICODE… en todo caso si me quedo la duda de los UTFs
@Wbarrantes
Gracias por los comentarios y las explicaciones WBbarrantes.
Aquí quedan y esperemos que le puedan ser de utilidad a alguien más.
Un saludo.
hola, un link para bajar la librerias faltantes porfavor ?
mesale esto y no encue entro las librerias faltante gracias
[Pascal Fatal Error] Unit1.pas(7): F1026 File not found: ‘ADODB.dcu’
@sergio
Hola Sergio.
Esas librerías que comentas no se pueden distribuir puesto que son propiedad de Delphi; Además deben estar en tu equipo, pues la instalación las añade (dependiendo de la versión de Delphi con la que estés trabajando).
Un saludo.
gracias (^_^)
bueno entonces tengo delphi 10 pero alparecer le hacen falta complementos en Data Acces, donde nadamas tengo «Datasource».
Ademas que todos los ejemplos usan el TQuery del DataAccess. hay una version y cual tenga todo para trabajar bien con BD o unlink para bajar e intalarlos complementos faltantes del Data acces en Delphi 10
@sergio
¿Qué versión de Delphi 2010 tienes?