Genera istruzioni SQL di inserimento da un file CSV
Domanda
Devo importare un file CSV in Uccello di fuoco e ho passato un paio d'ore a provare alcuni strumenti e nessuno si adattava alle mie esigenze.
Il problema principale è che tutti gli strumenti che ho provato mi piacciono Importazione dati EMS E Procedura guidata per i dati di Firebird aspetto che il mio file CSV contenga tutte le informazioni necessarie alla mia tabella.
Devo scrivere un codice SQL personalizzato nell'istruzione insert, ad esempio, ho un file CSV con il nome della città, ma poiché il mio database ha già tutte le città in un'altra tabella (normalizzata), devo scrivere una sottoselezione nell'istruzione insert dichiarazione per cercare la città e scrivere il suo ID, inoltre ho una procedura memorizzata per creare GUID.
La mia dichiarazione di inserimento sarebbe qualcosa del genere:
INSERT INTO PERSON (ID, NAME, CITY_ID) VALUES((SELECT NEW_GUID FROM CREATE_GUID), :NAME, (SELECT CITY_ID FROM CITY WHERE NAME = :CITY_NAME)
Come posso affrontare questo problema?
Soluzione
È un po' rozzo, ma per lavori occasionali a volte uso Excel.
Se importi il file CSV in Excel, puoi creare una formula che crea un'istruzione INSERT utilizzando la concatenazione di stringhe nella formula.Quindi, se il tuo file CSV ha 3 colonne che appaiono nelle colonne A, B e C in Excel, potresti scrivere una formula come...
="INSERT INTO MyTable (Col1, Col2, Col3) VALUES (" & A1 & ", " & B1 & ", " & C1 & ")"
Quindi puoi replicare la formula su tutte le righe e copiare e incollare la risposta in un file di testo da eseguire sul tuo database.
Come ho detto, è rozzo, ma può essere un modo piuttosto "veloce e sporco" di portare a termine un lavoro!
Altri suggerimenti
Bene, se si tratta di un CSV, e si tratta di un processo una tantum, apri il file in Excel, quindi scrivi le formule per popolare i tuoi dati nel modo desiderato, quindi scrivi una semplice formula Concat per costruire il tuo SQL e quindi copia quella formula per ogni riga.Otterrai un gran numero di istruzioni SQL che potrai eseguire ovunque tu voglia.
Fabio,
Ho fatto quello che ha fatto Vaibhav molte volte, ed è un buon modo "veloce e sporco" per inserire dati in un database.
Se è necessario eseguire questa operazione alcune volte o in base a un tipo di pianificazione, un modo più affidabile consiste nel caricare i dati CSV "così come sono" in una tabella di lavoro (ad esempio customer_dataload) e quindi utilizzare istruzioni SQL standard per popolare il file campi mancanti.
(Non conosco la sintassi di Firebird, ma qualcosa del genere...)
UPDATE person
SET id = (SELECT newguid() FROM createguid)
UPDATE person
SET cityid = (SELECT cityid FROM cities WHERE person.cityname = cities.cityname)
eccetera.
Di solito, è molto più veloce (e più affidabile) inserire i dati nel database e quindi correggerli piuttosto che provare a correggerli durante il caricamento.Ottieni anche il vantaggio delle transazioni che ti consentono di eseguire il ROLLBACK se non funziona!!
Potresti importare il file CSV in una tabella così com'è, quindi scrivere una query SQL che esegua tutte le trasformazioni richieste sulla tabella importata e inserisca il risultato nella tabella di destinazione.
Quindi qualcosa del tipo:
<(carica il file CSV in temp_table - n, city_name)>
inserire in target_table
seleziona t.n, c.city_id come città
da temp_table t, città c
dove t.nome_città = c.nome_città
Un bel consiglio sull'uso di Excel, ma suggerisco anche di prendere dimestichezza con un linguaggio di scripting come Python, perché per alcune attività è più semplice scrivere semplicemente uno script Python veloce per eseguire il lavoro piuttosto che cercare di trovare la funzione necessaria in Excel o in un pre- strumento realizzato che fa il lavoro.
utilizzare il file CSV come tabella esterna.Quindi puoi utilizzare SQL per copiare i dati dalla tabella esterna alla tabella di destinazione, con tutte le possibilità di SQL.Vedere http://www.firebirdsql.org/index.php?op=useful&id=netzka
Lo farei con awk.
Ad esempio, se avessi queste informazioni in un file CSV:
Bob,New York
Jane,San Francisco
Steven,Boston
Marie,Los Angeles
Il seguente comando ti darà ciò che desideri, eseguito nella stessa directory del tuo file CSV (denominato name-city.csv
in questo esempio).
$ awk -F, '{ print "INSERT INTO PERSON (ID, NAME, CITY_ID) VALUES ((SELECT NEW_GUID FROM CREATE_GUID), '\''"$1"'\'', (SELECT CITY_ID FROM CITY WHERE NAME = '\''"$2"'\''))" }' name-city.csv
Tipo awk --help
per maggiori informazioni.
Ho appena finito questo script VBA che potrebbe essere utile a questo scopo.Basterà modificare l'istruzione Insert per includere la tabella in questione e l'elenco delle colonne (ovviamente nella stessa sequenza in cui appaiono nel file Excel).
Function CreateInsertStatement()
'Output file location and start of the insert statement
SQLScript = "C:\Inserts.sql"
cStart = "Insert Into Holidays (HOLIDAY_ID, NAT_HOLDAY_DESC, NAT_HOLDAY_DTE) Values ("
'Open file for output
Open SQLScript For Output As #1
Dim LoopThruRows As Boolean
Dim LoopThruCols As Boolean
nCommit = 1 'Commit Count
nCommitCount = 100 'The number of rows after which a commit is performed
LoopThruRows = True
nRow = 1 'Current row
While LoopThruRows
nRow = nRow + 1 'Start at second row - presuming there are headers
nCol = 1 'Reset the columns
If Cells(nRow, nCol).Value = Empty Then
Print #1, "Commit;"
LoopThruRows = False
Else
If nCommit = nCommitCount Then
Print #1, "Commit;"
nCommit = 1
Else
nCommit = nCommit + 1
End If
cLine = cStart
LoopThruCols = True
While LoopThruCols
If Cells(nRow, nCol).Value = Empty Then
cLine = cLine & ");" 'Close the SQL statement
Print #1, cLine 'Write the line
LoopThruCols = False 'Exit the cols loop
Else
If nCol > 1 Then 'add a preceeding comma for all bar the first column
cLine = cLine & ", "
End If
If Right(Left(Cells(nRow, nCol).Value, 3), 1) = "/" Then 'Format for dates
cLine = cLine & "TO_DATE('" & Cells(nRow, nCol).Value & "', 'dd/mm/yyyy')"
ElseIf IsNumeric(Left(Cells(nRow, nCol).Value, 1)) Then 'Format for numbers
cLine = cLine & Cells(nRow, nCol).Value
Else 'Format for text, including apostrophes
cLine = cLine & "'" & Replace(Cells(nRow, nCol).Value, "'", "''") & "'"
End If
nCol = nCol + 1
End If
Wend
End If
Wend
Close #1
End Function
Puoi usare quello gratuito csvsql per fare questo.
- Installalo utilizzando queste istruzioni
Ora esegui un comando simile per importare i tuoi dati nel tuo database.Maggiori dettagli ai link sopra, ma sarebbe qualcosa del tipo:
csvsql --db firebase:///d=mydb --insert mydata.csv
Quanto segue funziona con sqlite ed è quello che utilizzo per convertire i dati in un formato facile da interrogare
csvsql --db sqlite:///dump.db --insert mydata.csv
opzione 1:1- hai provato IBExert?IBExpert \ Strumenti \ Importa dati (versione di prova o cliente).
opzione 2:2- carica il tuo file CSV in una tabella temporanea con F_BLOBLOAD.3- Crea una procedura memorizzata, che ha utilizzato 3 funzioni (F_StringLength, F_STRCOPY, F_MID) attraversare tutta la stringa, tirando i campi per costruire l'inserto.
collegamenti:2: http://freeadhocudf.org/documentation_english/dok_eng_file.html 3: http://freeadhocudf.org/documentation_english/dok_eng_string.html
Uno strumento che ho provato di recente e che ha funzionato straordinariamente bene è FSQL.
Scrivi un comando IMPORT, incollalo in FSQL
e importa il file CSV nella tabella Firebird.