2010-06-18 10 views
6

Come faccio ad andare in giro creando uno schema di tabella MYSQL ispezionando un file Excel (o CSV). Esistono librerie Python pronte per l'attività?Genera schema tabella ispezionando Excel (CSV) e importa i dati

Le intestazioni di colonna verrebbero sterilizzate ai nomi di colonna. Il tipo di dati verrà stimato in base al contenuto della colonna del foglio di calcolo. Al termine, i dati verrebbero caricati sul tavolo.

Ho un file Excel di ~ 200 colonne che voglio iniziare a normalizzare.

+0

Altre idee: http://stackoverflow.com/q/9998596/395857 –

risposta

1

Just for (la mia) di riferimento, ho documentato qui di seguito quello che ho fatto:

  1. XLRD è pratico, ma ho appena salvato i dati di Excel come CSV, quindi posso usare LOAD DATA INFILE
  2. I' ve copiato la riga di intestazione e ha iniziato a scrivere la sceneggiatura di importazione e la normalizzazione
  3. script fa: CREATE TABLE con tutte le colonne come testo, fatta eccezione per la chiave mysql
  4. interrogazione primaria: LOAD DATA LOCAL INFILE caricamento di tutti i dati CSV nei campi di testo.
  5. in base all'uscita di PROCEDURE ANALYSE, sono stato in grado di ALTER TABLE di fornire alle colonne i tipi e le lunghezze corrette. PROCEDURE ANALYSE restituisce ENUM per qualsiasi colonna con pochi valori distinti, che non è quello che mi serviva, ma ho trovato utile in seguito per la normalizzazione. 200 colonne con oculare per gli occhi è stato un gioco da ragazzi con PROCEDURE ANALYSE. L'output da PhpMyAdmin propone la struttura della tabella era spazzatura.
  6. Ho scritto un po 'di normalizzazione utilizzando principalmente SELECT DISTINCT su colonne e INSERT i risultati in tabelle separate. Ho aggiunto al vecchio tavolo una colonna per FK prima. Subito dopo lo INSERT, ho ottenuto il suo ID e UPDATE ed la colonna FK. Quando il ciclo è terminato, ho abbandonato la vecchia colonna lasciando solo la colonna FK. Allo stesso modo con più colonne dipendenti. È stato molto più veloce di quanto mi aspettassi.
  7. I ran (django) python manage.py inspctdb, copiato l'output in models.py e aggiunto tutti quelli ForeignkeyField s come gli FK non esistono su MyISAM. Ha scritto un po 'di views.py pitone, urls.py, alcuni modelli ... TADA
1

soluzione rapida e sporca con phpMyAdmin:

  • creare una tabella con la giusta quantità di colonne. Assicurati che i dati si adattino alle colonne.
  • Importare il CSV nella tabella.
  • Utilizzare la per proporre la struttura di tabella.
+1

Bene, PhpMyAdmin fa: "SELECT * FROM nome_tabella PROCEDURA ANALYZE()". Questo potrebbe aiutarmi. http://dev.mysql.com/doc/refman/5.0/en/procedure-analyse.html –

1

Per quanto ne so, non esiste uno strumento in grado di automatizzare questo processo (mi piacerebbe che qualcuno mi dimostrasse che avevo torto perché avevo già avuto questo problema esatto). Quando ho fatto questo, ho trovato due opzioni:
(1) Creare manualmente le colonne nel db con i tipi appropriati e quindi importare, oppure
(2) Scrivere un tipo di filtro che potrebbe "capire" quali tipi di dati dovrebbero essere le colonne. Sono andato con la prima opzione principalmente perché non pensavo di poter effettivamente scrivere un programma per fare l'inferenza di tipo.
Se si decide di scrivere uno strumento/conversione di inferenza di tipo, qui ci sono un paio di problemi che si possono avere a che fare:
(1) Le date di Excel vengono effettivamente memorizzate come il numero di giorni dal 31 dicembre 1899; come si deduce allora che una colonna è data in contrapposizione a qualche pezzo di dati numerici (popolazione ad esempio)?
(2) Per i campi di testo, basta creare le colonne di tipo varchar (n) dove n è la voce più lunga in quella colonna, oppure si rende un campo char senza limiti se una delle voci è più lunga di alcune limite? Se è così, qual è un buon limite superiore?
(3) Come si converte automaticamente un float in un decimale con la precisione corretta e senza perdere posizioni?
Ovviamente, questo non significa che non sarete in grado di (sono un programmatore piuttosto cattivo). Spero che lo farai, perché sarebbe uno strumento davvero utile da avere.

3

Utilizzare il modulo xlrd; start here. [Disclaimer: I'm the author]. xlrd classifica le celle in testo, numero, data, booleano, errore, vuoto e vuoto. Distingue le date dai numeri esaminando il formato associato alla cella (ad esempio "gg/mm/aaaa" rispetto a "0,00").

Il lavoro di programmazione del codice per guadare attraverso i dati immessi dall'utente per decidere quale tipo di dati DB utilizzare per ciascuna colonna non è qualcosa che può essere facilmente automatizzato. Dovresti essere in grado di esaminare i dati e assegnare tipi come interi, denaro, testo, data, datetime, tempo, ecc. E scrivere codice per verificare le tue ipotesi. Si noti che è necessario essere in grado di far fronte a dati numerici o di data immessi nei campi di testo (può sembrare OK nella GUI). È necessaria una strategia per gestire le celle che non si adattano al tipo di dati "stimato". Devi convalidare e pulire i tuoi dati. Assicurati di normalizzare le stringhe di testo (spazi bianchi in testa e in coda, sostituisci più spazi bianchi in un unico spazio. Il testo di Excel è Unicode (solo BMP), non bash in ASCII o "ANSI" - funziona in Unicode e codifica in UTF-8 per metterlo nel tuo database.