Gestione database ASCII / merging tabelle
conoscete un programma che fa merging di tabelle?
mi spiego meglio.
_ho il classico file ASCII pieno di dati, messi a colonne. mettiamo che la prima colonna contiene un nome, e le altre N dei valori numerici.
_ho un altro file ASCII, anch'esso con una colonna con un nome e altre colonne diverse da quelle del file precedente
_voglio fare un merging, nel senso di aggiungere al primo file le colonne del secondo ove ci sia una corrispondenza tra i nomi. oppure alternativamente creare un terzo file contenente l'intersezione dei due precedenti.
è vero che si potrebbe scrivere un programma in C++, concettualmente è semplice (una marea di vettori e IF...ELSE), ma non è una cosa velocissima. quindi vi chiedo se conoscete un programma che può fare al caso mio (non saprei proprio dove cercare)
grazie!
PS se non mi sono spiegato, i file ASCII di cui sto parlando hanno una struttura del genere:
mi spiego meglio.
_ho il classico file ASCII pieno di dati, messi a colonne. mettiamo che la prima colonna contiene un nome, e le altre N dei valori numerici.
_ho un altro file ASCII, anch'esso con una colonna con un nome e altre colonne diverse da quelle del file precedente
_voglio fare un merging, nel senso di aggiungere al primo file le colonne del secondo ove ci sia una corrispondenza tra i nomi. oppure alternativamente creare un terzo file contenente l'intersezione dei due precedenti.
è vero che si potrebbe scrivere un programma in C++, concettualmente è semplice (una marea di vettori e IF...ELSE), ma non è una cosa velocissima. quindi vi chiedo se conoscete un programma che può fare al caso mio (non saprei proprio dove cercare)
grazie!
PS se non mi sono spiegato, i file ASCII di cui sto parlando hanno una struttura del genere:
nome p1 p2 p3 p4 .... MILANO 111 222 333 444 ..... LECCO 222 333 444 555 ..... COMO 333 444 555 666.... ...
Risposte
quale riga dovrebbe essere preferita in caso di nomi uguali?
@Sergio: è vero, questa scorciatoia può essere interessante se non si trova un programma dedicato. bisognerebbe però poi anche cancellare il nome che proviene dalla seconda riga, in quanto mi ritroverei nella situazione
ma si può fare. nel mio cuore speravo esistesse un programma "dedicato" per i database, come Microsoft Access, di cui però ho letto esplicitamente che non è capace di fare merge di tabelle.
@apatriarca: forse non ci siamo intesi. i file 1.txt e 2.txt contengono dati diversi per lo stesso nome. ad esempio in 1.txt ho gli abitanti, la superficie e la densità di popolazione delle città e in 2.txt il numero di televisori e di cellulari. oppure non ho capito la tua obiezione.
... GENOVA 111 222 333 MILANO 111 222 333 MILANO 444 555 NAPOLI 111 222 333 ...
ma si può fare. nel mio cuore speravo esistesse un programma "dedicato" per i database, come Microsoft Access, di cui però ho letto esplicitamente che non è capace di fare merge di tabelle.
@apatriarca: forse non ci siamo intesi. i file 1.txt e 2.txt contengono dati diversi per lo stesso nome. ad esempio in 1.txt ho gli abitanti, la superficie e la densità di popolazione delle città e in 2.txt il numero di televisori e di cellulari. oppure non ho capito la tua obiezione.
Sì, in effetti non avevo capito la situazione. Adesso mi è tutto più chiaro. Non conosco però programmi che facciano una cosa del genere su file di testo.
"apatriarca":
Sì, in effetti non avevo capito la situazione. Adesso mi è tutto più chiaro. Non conosco però programmi che facciano una cosa del genere su file di testo.
ovviamente non mi interessa dover passare eventualmente da un programma specifico per database o tabelle, l'importante è che si possano esportare/importare file di testo.
ad esempio Excel riesce a gestire senza problemi file .txt, ma purtroppo non mi sembra in grado di fare il merge che mi serve.
Mi sembra un classico problema che si può risolvere con qualche decina di righe di codice in Perl o in un altro linguaggio di scripting. Se ti interessa ancora posso scriverti uno script in Python, eventualmente compilato come eseguibile per Windows.
grazie mille!
purtroppo non so utilizzare nè perl nè python, ma stimolato da questo esempio mi sa che cercherò di imparare.
purtroppo non so utilizzare nè perl nè python, ma stimolato da questo esempio mi sa che cercherò di imparare.

L'esempio di Sergio mi farebbe venir voglia di impare Python. Perl è troppo criptico come linguaggio per i miei gusti. 
E poi se persino il M.I.T ha deciso di sostituire Scheme con Python nei suoi corsi base, un motivo ci sarà...

E poi se persino il M.I.T ha deciso di sostituire Scheme con Python nei suoi corsi base, un motivo ci sarà...
"Sergio":
Be', se insisti....
Ottima soluzione direi, però il mio ha il 34% di righe di codice in meno e ordina pure le righe di output.


#!/usr/bin/env python import sys, string def get_lines(filename): ifile = open(filename, "r") lines = ifile.readlines() lines.sort() ifile.close() return lines def get_name_values(line): tokens = line.split() return tokens[0], tokens[1:] if __name__ == '__main__': lines_1 = get_lines(sys.argv[1]) for line_1 in lines_1: name_1, values_1 = get_name_values(line_1) lines_2 = get_lines(sys.argv[2]) for line_2 in lines_2: name_2, values_2 = get_name_values(line_2) if name_1[0] == name_2[0]: print name_1 + ' ' + string.join(values_1 + values_2)
"Sergio":
Sì. In effetti ho usato Python per poco tempo e mi ero limitato a tradurre "pedestremente" lo script Perl
Figurati, io l'ho scritto di getto in 2 minuti, senza far nessun controllo, visto che l'intento era soltanto quello di mostrare come il codice in Python sia più leggibile, secondo me, rispetto a uno in Perl per chi non ha nessuna conoscenza di programmazione. Pensavo fosse evidente dalle emoticons che stavo scherzando, mi sembra invece che l'hai presa come una sfida e un tentativo di denigrare il Perl.

Comunque la tua soluzione:
a) non mi pare il massimo dell'efficienza perché, se non sbaglio, legge ed ordina le righe del secondo file tante volte quante sono le righe del primo: un vero spreco...
Il motivo per cui non funziona a dovere te l'ho detto, comunque visto che ci siamo, si può renderlo un poco più efficiente togliendo la riga di sort() dalla funzione get_lines() e spostandola sotto la prima chiamata alla suddetta funzione come lines_1.sort()
b) dato che il merge avviene sulla base del primo file, non mi pare funzioni se il secondo file ha righe che iniziano diversamente da tutte quelle del primo (prova ad aggiungere "Perugia 11 12 13 14" al secondo file).
Be', qui è evidente il refuso dovuto al refactoring, basta togliere i due [0] nella seconda if e l'esempio funziona. Come detto è solo una dimostrazione, perché manca ad esempio il controllo degli argomenti della riga di comando e della validità dei dati in input, cosa che faccio sempre, anche se non ho mai programmato in Perl.

Complimenti per i tuoi due listati, si vede che ci sai fare.

P.S. Anche il tuo però ha qualche problema nel caso ci siano dei record duplicati nel secondo file.
