Crea una tabella da un file CSV con intestazioni


12

Sto cercando di trovare un modo per generare una nuova tabella MySQL basata esclusivamente sul contenuto di un CSV specificato. I file CSV che userò hanno le seguenti proprietà;

  • "|" delimitato.
  • La prima riga specifica i nomi delle colonne (intestazioni), anche "|" delimitato.
  • I nomi e l'ordine delle colonne non sono fissi.
  • Il numero di colonne non è fisso.
  • I file sono di grandi dimensioni (1 mil righe / 50 colonne).

In Excel questo è piuttosto semplice, tuttavia con MySQL non sembra essere (nessuna fortuna con Google). Qualche suggerimento su cosa dovrei guardare?

Risposte:


10

Puoi usare csvsql , che fa parte di csvkit(una suite di utility per la conversione e il funzionamento con file CSV):

  • Linux o Mac OS X
  • gratuito e open source
  • sudo pip install csvkit
  • Esempio: csvsql --dialect mysql --snifflimit 100000 datatwithheaders.csv > mytabledef.sql
  • Crea CREATE TABLEun'istruzione basata sul contenuto del file. I nomi delle colonne sono presi dalla prima riga del file CSV.

2

Se stai bene usando Python, Pandas ha funzionato benissimo per me (csvsql è stato impiccato per sempre e meno numeri e righe rispetto al tuo caso). Qualcosa di simile a:

from sqlalchemy import create_engine
import pandas as pd

df = pd.read_csv('/PATH/TO/FILE.csv', sep='|')
# Optional, set your indexes to get Primary Keys
df = df.set_index(['COL A', 'COL B'])

engine = create_engine('mysql://user:pass@host/db', echo=False)

df.to_sql(table_name, engine, index=False)

Dove si definisce dwh_engine? È un errore di battitura e intendevi engine?
joanolo

Sì dovrebbe essere engine! Corretta la risposta grazie per aver individuato
ivansabik il

to_sql impiega troppo tempo se il numero di righe è alto. Per noi, circa 36000 file hanno impiegato circa 90 minuti. Un'istruzione di caricamento diretto è stata eseguita in 3 secondi.
mvinayakam,

0

È necessario generare una CREATE TABLE basata su tipi di dati, dimensioni, ecc. Delle varie colonne.

Quindi usi LOAD DATA INFILE ... I CAMPI TERMINATI DA '|' LINEE TERMINATE DA "\ n" SKIP 1 LINE ...; (Vedi la pagina di manuale per i dettagli.)

Fai altrettanto per ogni tabella CSV ->.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.