Newsgroup: it.comp.lang.delphi
Titolo: database in file di testo

Ciao a tutti!
Devo leggere un database di piu di 150 mega, si tratta di un file di testo
con separazione con "|".
Su questo database poi possono essere eseguite ricerche. Cosa mi converrebbe
fare?
Credo lo si possa anche leggere come database testo, ma come si fa a
impostare il separatore che non e' ";"?
Conviene piuttosto perdere un bel po' di tempo di esecuzione e trasformarlo
in un altro database? Se si, quale e' piu' efficiente con milionate di
record?
Grazie
--
Andrea

il bde ha un driver x usare i file di testo con record a lunghezza fissa com
gli oggetti TTable.
In pratica, puoi creare indici, fare delle locate, ma niente SQL.
Se intendi utilizzare un database, cosa che io ti consiglio, puoi scegliere
interbase o firebird.
Bye
A.

 ha scritto nel messaggio
news:amdnel$b2f$1...@lacerta.tiscalinet.it...

Vedi su Torry il componente open-source
SDF-CSV DataSet v.2.05
permette di stabilire il delimitatore.
Cmq puoi fare anche una lettura sequenziale aprendo a mano il file di tipo
TextFile.
L'accesso diretto ai file è molto veloce, ma se devi lavorare molto e fare
analisi su questo archivio ti consiglio se puoi di creare una procedura di
caricamento dati e fare le dovute selezioni all'interno di un archivio (per
esempio su Interbase) con istruzioni SQL con cui puoi fare oltre alla
semplice ricerca e selezione, anche delle sommatorie (credo che alla fine ti
servono sempre).
Ciao,
  Fabio

 fare?
Io ti consiglio di convertire il database in un formato dove lo puoi
interrogare con l'Sql.
Per quanto riguarda la scelta del database ti consiglio Oracle, se puoi
spendere o Postgres se vuoi qualcosa di free.
Visto che ti ho consigliato di convertire il DB e che ho già fatto una cosa
simile, ho pensato che poteva servirti questa funzione:
//*************************************************************
//funzione che converte un file di testo ASCII in un database Postgres o
//altri che supportano l'SQL)
//
//->Variabili input:
//fileanom => nome file: anomalie.txt generato automaticamente se viene
// trovata una riga con più separatori
//filedest => file destinazione: risultato.txt generato automaticamente
//filesorg => file sorgente: nome del file.txt dal quale si recuperano i
campi
//separatore => separatore campi (per esempio "|")
//ncampi=> numero dei campi del database
//
//->Variabili output:
//risfinale => restituisce il valore che identifica il buon o cattivo
// andamento della conversione
**********************************************************
function txt2postgres(nomi : array of string;fileanom : string;filesorg :
string;separatore : string;ncampi : integer;progressbar1 :
Tprogressbar;query1 : Tquery;data1 : TDatabase):string;
var
x: integer; //variabile contatore per un ciclo for
i: integer; //var per contare il numero totale delle righe per la barra
progressiva
k: integer; //variabile contenente l'indice del vettore a[]
y: integer; //variabile di controllo errori
n: integer; //variabile contatore per un ciclo for
lstr: integer; //variabile ke contiene la lunghezza della riga (in cifre)
stringa: string; //variabile che contiene la riga letta dal file di testo
appo: string; //var di appoggio per la configurazione del parametro della
query
stringa2: string; //variabile che contiene il carattere letto da stringa
stringa3: string; //inutile verrà eliminata quando disporremo del database
risfinale: string; //variabile che contiene il valore che deve restituire la
funzione
sorgente: textfile; //file da convertire
anomalia: textfile; // file che contiene le eventuali anomalie
a: array of string; //vettore contenente i campi ormai separati
begin
    // definisco le dimensioni del vettore di lunghezza del numero dei campi
    setlength(a,ncampi);
    // controllo l'esistenza dei file da creare e se esistono vengono cancellati
e poi ricreati
    if fileexists(fileanom) then
       deletefile(fileanom);
    assignfile(anomalia,fileanom);
    rewrite(anomalia);
    query1.sql.Clear;
    if query1.Active then
       query1.close;
    // vuoto tutta la tabella ditte prima di ricarici sopra una nuova versione
    query1.sql.add('delete from ditte');
    query1.ExecSQL;
    query1.SQL.clear;
    // apro la transazione sul database
    query1.sql.Add('set transaction isolation level serializable');
    query1.ExecSQL;
    query1.SQL.clear;
    data1.startTransaction;
    // controllo l'esistenza del file sorgente e se esiste lo carico, altrimenti
esco dalla funzione
    if not fileexists(filesorg) then
    begin
       messagedlg('File non trovato: '+ filesorg,mtError,[mbok],0);
       risfinale:='2';
       result:=risfinale;
       exit;
    end
    else
    begin
       assignfile(sorgente,filesorg);
    end;
    x:=0;
    i:=0;
    k:=0;
    n:=0;
    // conto le righe del file sorgente per assegnare il valore massimo alla
progressbar
    reset(sorgente);
    while not eof(sorgente) do
    begin
         readln(sorgente,stringa);
         stringa:='';
         I:=i+1;
    end;
    progressbar1.max:=i;
    // se non ci saranno problemi risfinale dovrà restare = '0'
    risfinale:='0';
    y:=0;
    reset(sorgente);
    // ciclo per leggere tutte le righe del file sorgente
    for x:=1 to i do
    begin
        // ciclo per l'azzeramento del vettore
        for k:=0 to (ncampi-1) do
            a[k]:='';
        k:=0;
        stringa3:='';
        readln(sorgente,stringa);
        lstr:=length(stringa);
        for n:=1 to lstr do
        begin
            stringa2:= copy(Stringa,n,1);
            if stringa2 = separatore then
               k:=k+1
            else
               a[k]:=a[K]+stringa2;
        end;
        // controllo che il numero dei delimitatori sia = al numero dei campi o -1 o
+1
        // altrimenti risfinale diventa = '1' e vengono salvati nel file
anomalia.txt il numero
        // della riga contenuto in x.
        if not ( (k = ncampi) or ((k+1) = ncampi) or ((k-1) = ncampi) ) then
        begin
           if y=0 then
           begin
              writeln(anomalia,'');
              append(anomalia);
              writeln(anomalia,'Righe rilevate con un numero di separatori errato:');
              append(anomalia);
              y:=1;
           end;
           writeln(anomalia,'');
           append(anomalia);
           writeln(anomalia,inttostr(x));
           risfinale:='1';
        end;
        // salvo sulla tabella ditte tutti i valori appena letti
        stringa3:='insert into ditte (';
        for k:=0 to (ncampi-1) do
        begin
            stringa3:=stringa3+nomi[k];
            if k<>(ncampi-1) then
               stringa3:=stringa3+',';
        end;
        stringa3:=stringa3+') values (';
        for k:=1 to ncampi do
        begin
            stringa3:=stringa3+':par';
            str(k,appo);
            stringa3:=stringa3+appo;
            if k<>ncampi then
               stringa3:=stringa3+',';
        end;
        stringa3:=stringa3+');';
        query1.sql.add(stringa3);
        for k:=0 to (ncampi-1) do
            query1.Params[k].asstring:=a[k];
        query1.ExecSQL;
        query1.sql.clear;
        progressbar1.stepby(1);
    end;
    // salvo definitivamente tutte le righe solo a fine funzione
    data1.commit;
    // chiudo i file aperti e restituisco il valore finale della funzione
    result:=risfinale;
    closefile(sorgente);
    closefile(anomalia);
end;
///////////////////////fine
funzione////////////////////////////////////////////
Spero di esserti stato utile!
Bye.
Daniel.
--------------------------------
Inviato via 
http://usenet.libero.it

 postgres su winsozz?
Si', non ho approfondito, ma credo abbia bisogno di un toolkit della Cygwin
per funzionare correttamente.


postgres su winsozz?
A.

un mio collega che fa sviluppo web lo usa su Linux.
Mi diceva che su win non è proprio il top, che lo fanno girare giusto x
testare le cose.
Non so...
A.