Forum
>>
Programmazione Python
>>
Files e Directory
>>
convertire un "db" da formato txt a sqlite
Pagina: 1
Esegui il login per scrivere una risposta.
Pagina: 1
Scritto da ermac god |
2020-10-13 12:47:29 - convertire un "db" da formato txt a sqlite
|
Ciao premetto che sono alle prime armi... detto questo dovrei riuscire a convertire un "database" che era stato fatto con un vecchio programma in un file di testo mono colonna (circa 700000 righe...) cosi fatto
STRINGA1 STRINGA2 stringa2_valore STRINGA3 stringa3_valore STRINGA4 stringa4_valore STRINGA5 stringa5_valore1 stringa5_valore2 stringa5_....... stringa5_valoreX STRINGA6 stringa6_valore STRINGA1 STRINGA2 stringa2_valore STRINGA3 stringa3_valore STRINGA4 stringa4_valore STRINGA5 stringa5_valore1 stringa5_valore2 stringa5_....... stringa5_valoreX STRINGA6 stringa6_valore in pratica quello che vorrei riuscire a fare è che per ogni stringa vado a creare una colonna nella tabella del db nuovo formato da due tabelle collegate in relazione 1->N tabellla_a --------------------------------------------------------------------------- |STRING1|STRING2|STRING3|STRING4|STRING6| --------------------------------------------------------------------------- tabellla_b ------------------------------ |STRING1|STRING5| ------------------------------ In pratica: - quando vado a leggere il file vorrei che STRING1 fosse un contatore e che successivamente quel valore diventasse la chiave primaria delle tabelle - quando vado a leggere il file i valori di STRING2, STRING3, STRING4, STRING6 venissero inseriti nella tabella_a - quando vado a leggere il file i valori di STRING5 venissero inseriti nella tabella_b in relazione 1->N PS. la parte di inserimento dati nel db so già come farla quello che mi serve è un ciclo che mi tiri fuori della variabili utilizzabili in delle query di insert Grazie ancora ciao |
|
Scritto da nuzzopippo |
2020-10-14 09:40:18 - Re: convertire un "db" da formato txt a sqlite
|
Uhmm ... non hai problemi con i database ed hai problemi con il parsing dei file di testo? ... forse dovresti vedere un po' più di base.
Il Tuo problema, se ho capito bene, riguarda come procedere a leggere il file una riga per volta individuando i "campi" ed i valori per poi "agire" ... sarebbe stato bene che Tu fossi stato un po' più esplicito nella Tua presentazione dei dati, ma tant'è. Per poterTi rispondere bisogna fare dei presupposti, abbastanza banali ma che vanno detti: il primo è che la struttura sia "costante" e che "STRINGA1" rappresenti l'inizio di un record, il secondo è che le stringhe da "STRINGA2" a "STRINGA6" siano sempre presenti, individuino i "nomi di colonna" e siano immediatamente seguiti dai loro "valori" e che solo il campo "STRINGA5" presenti più valori ... Ok? Per risponderTi, e rendere meno confusa l'esposizione, ho immaginato un "registro prestiti" alla buona ove ad un soggetto venga associato un importo, un numero di rate, le rate pagate (corrispondenti al Tuo "STRINGA5") e la data di scadenza, corrispondente alla Tua strutturazione secondo le considerazioni su esposte, per esemplificare ho preparato un file, denominato "pseudo_dati", con questo contenuto : RECORD SOGGETTO Massimiliano IMPORTO 2500 RATE 25 RIMBORSI 100 100 200 100 SCADENZA 30/06/2022 RECORD SOGGETTO Emanuela IMPORTO 1500 RATE 30 RIMBORSI 50 100 50 200 SCADENZA 31/10/2022 RECORD SOGGETTO Luciana IMPORTO 2000 RATE 10 RIMBORSI 200 100 300 SCADENZA 31/03/2021Come puoi vedere al Tuor "STRINGA1" corrisponde il più esplicito "RECORD", la struttura è a singola colonna e conforme alle considerazioni sopra. Per leggere il file, dovremo procedere, quindi, una riga alla volta, tramite la funzione "readline()" dei file, trovi qua la docs circa a fine pagina, ripulendo i dati dal linefeed nel mio caso (linux), valutando i nomi dei campi ed agendo di conseguenza ... ovviamente dovremo farlo tramite un ciclo while ed un po' di "if", trattando nuovamente in un while i dati contenuti dal campo "RATE" (corrispondente al Tuo "STRINGA5") ed il successivo. Dato che a Te serve la sola "lettura", ho definito un oggetto "Debitore" per il contenimento e restituzione dei dati, oltre un paio di funzioni di utilità per la visualizzazione dei dati, questo è il codice : # -*- coding: utf-8 -*- class Debitore: def __init__(self, cod, name=None, importo=None, rate=None, scadenza=None): self.codice = cod self.name = name self.importo = importo self.rate = rate self.scadenza = scadenza self.pagato = [] def add_pagamento(self, importo): self.pagato.append(importo) def get_data(self): data = (self.codice, self.name, self.importo, self.rate, self.scadenza) return data def get_pagamenti(self): data = [] for p in self.pagato: data.append((self.codice, p)) return data def view_data(data): for element in data: print(element, end=', ') print() def view_payment(data): for p in data: print(' cod: %4d - pagato %.2f' % (p0, p1)) if __name__ == '__main__': df_name = 'pseudo_dati' df = open(df_name, 'r') row_data = df.readline().rstrip('\n') counter = 0 while row_data: if row_data == 'RECORD': counter += 1 deb = Debitore(counter) elif row_data == 'SOGGETTO': deb.name = df.readline().rstrip('\n') elif row_data == 'IMPORTO': deb.importo = float(df.readline().rstrip('\n')) elif row_data == 'RATE': deb.rate = int(df.readline().rstrip('\n')) elif row_data == 'RIMBORSI': rata = df.readline().rstrip('\n') while not rata == 'SCADENZA': deb.add_pagamento(float(rata)) rata = df.readline().rstrip('\n') deb.scadenza = df.readline().rstrip('\n') view_data(deb.get_data()) view_payment(deb.get_pagamenti()) print() row_data = df.readline().rstrip('\n') df.close()e questo è l'output che si ottiene : >>> ======= RESTART: /media/nuzzopippo/E9D3-42C1/test_vari/ermac/trasporter.py ====== 1, Massimiliano, 2500.0, 25, 30/06/2022, cod: 1 - pagato 100.00 cod: 1 - pagato 100.00 cod: 1 - pagato 200.00 cod: 1 - pagato 100.00 2, Emanuela, 1500.0, 30, 31/10/2022, cod: 2 - pagato 50.00 cod: 2 - pagato 100.00 cod: 2 - pagato 50.00 cod: 2 - pagato 200.00 3, Luciana, 2000.0, 10, 31/03/2021, cod: 3 - pagato 200.00 cod: 3 - pagato 100.00 cod: 3 - pagato 300.00 >>>Ovviamente il tutto trattato il più semplicemente possibile ed al minimo necessario ... risponde alla Tua domanda? N.B. - per 700.000 righe non è che sia una meraviglia di codice, questo è solo un "LA" esemplificativo. Fatti non foste a viver come bruti... |
|
Scritto da ermac god |
2020-10-14 18:03:10 - Re: convertire un "db" da formato txt a sqlite
|
Ciao
grazie mille!!!!! è esattamente quello che volevo fare ora devo vederla con più calma nel dettaglio... in teoria (o almeno spero) i campi dovrebbero essere sempre gli stessi infatti gli avevo evidenziati con colori diversi. Il programma lo aveva creato uno studente quasi 22 anni fa (era nato per windows98... ma come si dice di solito se una cosa funziona perchè cambiarla. Finchè cera windows 7 funzionava senza problemi (a parte qualche crash) ma con il passaggio forzato a windows 10 ha smesso completamente di funzionare... E si come accennavo all'inizio non so praticamente nulla di programmazione all'infuori di un po di scripting di bash per la gestione del sistema ma poca roba.... PS. Per la questione delle 700000 righe lo avevo detto nel caso a qualcuno fosse passato per la testa di fare tutto a manina ... --- Ultima modifica di ermac in data 2020-10-14 18:03:42 --- |
Pagina: 1
Esegui il login per scrivere una risposta.