Forum >> Programmazione Python >> Files e Directory >> convertire un "db" da formato txt a sqlite

Pagina: 1

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

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
...
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
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/2021
Come 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...
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 ;) :D...


--- Ultima modifica di ermac in data 2020-10-14 18:03:42 ---


Pagina: 1



Esegui il login per scrivere una risposta.