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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top