Inicio > Código, Delphi, Ejemplos, Fácil > Cargar datos de un TXT a un TDataset (utilizando ADO) – Parte 2

Cargar datos de un TXT a un TDataset (utilizando ADO) – Parte 2

Share Button

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>

Vota este post
  1. Nasedo
    miércoles, 3 de junio de 2009 a las 20:50 | #1

    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!!

  2. Neftalí
    jueves, 4 de junio de 2009 a las 12:04 | #2

    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.

  3. cecidvs
    domingo, 5 de julio de 2009 a las 22:48 | #3

    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.

  4. Neftalí
    lunes, 6 de julio de 2009 a las 10:23 | #4

    @cecidvs
    De nada.
    Esbueno saber que determinadas cosas se son útiles a alguien.

    Un saludo.

  5. viernes, 10 de julio de 2009 a las 01:35 | #5

    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

  6. Neftalí
    viernes, 10 de julio de 2009 a las 12:08 | #6

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

  7. lupis
    jueves, 2 de diciembre de 2010 a las 18:07 | #7

    hola,como puedo leer un archivo de texto separado por tabuladores y mostrarlo en php

  8. Neftalí
    viernes, 3 de diciembre de 2010 a las 11:33 | #8

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

  9. Wbarrantes
    jueves, 10 de febrero de 2011 a las 19:31 | #9

    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

  10. Neftalí
    jueves, 10 de febrero de 2011 a las 20:34 | #10

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

  11. Wbarrantes
    martes, 22 de febrero de 2011 a las 18:13 | #11

    @Neftalí

    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…

  12. Wbarrantes
    martes, 22 de febrero de 2011 a las 22:16 | #12

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

  13. Wbarrantes
    miércoles, 23 de febrero de 2011 a las 00:08 | #13

    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…

  14. Wbarrantes
    miércoles, 23 de febrero de 2011 a las 00:49 | #14

    ya me funciono con UNICODE… en todo caso si me quedo la duda de los UTFs

  15. Neftalí
    miércoles, 23 de febrero de 2011 a las 09:11 | #15

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

  16. sergio
    viernes, 4 de mayo de 2012 a las 09:43 | #16

    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’

  17. Neftalí
    viernes, 4 de mayo de 2012 a las 15:05 | #17

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

  18. sergio
    sábado, 5 de mayo de 2012 a las 00:00 | #18

    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

  19. Neftalí
    lunes, 7 de mayo de 2012 a las 09:53 | #19

    @sergio
    ¿Qué versión de Delphi 2010 tienes?

  1. viernes, 22 de mayo de 2009 a las 11:02 | #1