PDA

Ver la Versión Completa : convertir un archivo .csv a .dbf en runtime


jazmin
16-03-2007, 22:41:50
Hola muchachones:) necesito convertir un archivo
csv a uno dbf en delphi pero que este en run time

Me propusieron que con una componente TExcelApplication y usas los métodos de la interfaz OLE de Excel para guardar el archivo como Dbase.

Pero no se como:o nunca he manejado ese componente me podrian ayudar
gracias!
:p

roman
16-03-2007, 23:41:16
No veo necesidad de usar Excel como intermediario. Yo intentaría lo siguiente:

1. Usar el DatabaseDesktop para crear la tabla DBF vacía
2. Leer el archivo CVS en un StringList
3. Usar una componente Table para acceder a la tabla creada
3. Ciclar sobre todas las líneas del StringList para exportar a la tabla DBF:



for i := 0 to StringList.Count - 1 do
begin
...
end;


a. Cada línea del archivo será un conjunto de valores separados por comas. Usa un segundo StringList auxiliar para separar los valores en líneas:


sl.CommaText := StringList[i]; // i = índice de línea actual


b. Un ciclo anidado sobre el StringList auxiliar para copiar los valores en los campos de la tabla:


// insertas registro en blanco
Table.Append;

Copias valores a campos
for j := 0 to sl.Count - 1 do
Table.Fields[j].Value := sl[j];

// Guardas registro
Table.Post;



Claro que si los registros son muchos puede ser un poco lento usar un StringList para el archivo CSV, pero podrías leer línea a línea con los clásicos ReadLn(Archivo).

// Saludos

jazmin
16-03-2007, 23:46:54
Voy a intentarlo
pero fijate que si son muchos registros son mmm como unos 40 campos y unos mil registros
asi que va tardar bastantito!

lo que hago ahorita es abrirlo en excel y el senkeys mando teclazos para grabarlo pero abriendo el excel lo cual me implica que el usuario no deje usar la pc si no tiene muchos problemas
lo voy a intentar
claro que si tienes una mejor idea la recibiere anciosamente

eres un niño hermoso!:p

roman
16-03-2007, 23:55:39
No sé, mil registros no se me hace mucho. Pero, como te decía, puedes optar por algo así:


var
Archivo: TextFile;
Linea: String;
sl: TStringList;
j: Integer;

begin
AssignFile(Archivo, 'archivo.csv');
Reset(Archivo);

sl := TStringList.Create;

try
while not EoF(Archivo) do
begin
ReadLn(Archivo, Linea);
sl.CommaText := Linea;

Table.Append;

for j := 0 to sl.Count - 1 do
Table.Fields[j].Value := sl[j];

Table.Post;
end;
finally
sl.Free;
end;

CloseFile(Archivo);
end;


// Saludos

jazmin
17-03-2007, 00:01:27
ok gracias roman!

mira ya me tengo que ir salgo pero mañana a primerita hora lo intento

eres un amorzote!

te ganaste un beso!
smuaaaaaaaack
jijijijiji
virtual no te emociones!

va bye!!!:p

jazmin
18-03-2007, 17:58:32
si jalo me parecio muy buena la solucion pero....

un ultimo favorcillo

tengo 5 campos date en mi tabla destino y al pasarlo me marca errores
tuve que cambiar mi campos a tipo string para que los pudiera pasar

fijate que se me ocurre comprobar los datos con trystrtodate
para ver si son fecha los cambio a tipo fecha y los grabo o tienen alguna mejor idea?