Generați instrucțiuni de inserare SQL dintr-un fișier csv

Trebuie să importați un fișier csv în Firebird și am petrecut câteva ore încercând niște instrumente și niciuna nu se potrivește nevoilor mele.

Principala problemă este că toate instrumentele pe care le-am încercat sunt ca Import date EMS și < a href = "http://www.sqlmaestro.com/products/firebird/datawizard/help/06_01_05_csv/" rel = "noreferrer"> Expertul pentru datele Firebird se așteaptă ca fișierul meu csv conține toate informațiile necesare tabelului meu.

Trebuie să scriu niște SQL personalizate în instrucțiunea insert, de exemplu, am un fișier cvs cu numele orașului, dar deoarece baza mea de date conține deja toate orașele dintr-un alt tabel (normalizat), trebuie să scriu o subselectă în inserție declarație de căutare pentru oraș și scrie ID-ul său, de asemenea, am o procedură stocată pentru a cread GUIDS.

Instrucțiunea pentru introducerea mea ar fi ceva de genul:

INSERT INTO PERSON (ID, NAME, CITY_ID) VALUES((SELECT NEW_GUID FROM CREATE_GUID), :NAME, (SELECT CITY_ID FROM CITY WHERE NAME = :CITY_NAME)

Știu că este foarte ușor să scriu o cerere pentru a face acest lucru, dar nu-mi place să reinventez roata și sunt sigur că există niște instrumente acolo pentru ao face.

Puteți să-mi dați niște sfaturi?

0
fr hi bn

14 răspunsuri

Folosesc uneori Cel mai simplu generator de coduri din lume (ediția Javascript) . Este online, dar este doar JavaScript - datele dvs. nu merg nicăieri. Există, de asemenea, o versiune asp , cu mai multe funcții.

0
adăugat
Cum este expresia regulată în aceste instrumente pentru a genera Inserare ?
adăugat autor Kiquenet, sursa
Am folosit o variantă de acest lucru (adăugând în esență un pic de cod personalizat pentru a face un pic de masaj de date pe care cazul meu nevoie) și a venit cu o soluție templating care mă salvează literal ore de fiecare dată când am să re- m lucrează la .. obținerea datelor din Excel, BTW.
adăugat autor schonarth, sursa

Este un pic brutal - dar pentru un job off, eu folosesc uneori Excel.

Dacă importați fișierul CSV în Excel, puteți crea o formulă care creează o instrucțiune INSERT utilizând o concatenare string în formula. Deci - dacă fișierul dvs. CSV are 3 coloane care apar în coloanele A, B și C în Excel, puteți scrie o formulă ca ...

="INSERT INTO MyTable (Col1, Col2, Col3) VALUES (" & A1 & ", " & B1 & ", " & C1 & ")"

Apoi, puteți replica formula în jos toate rândurile dvs. și copiați și inserați răspunsul într-un fișier text pentru a rula împotriva bazei dvs. de date.

Asa cum zic eu - este crud - dar poate fi destul de rapid si murdar de a face o treaba!

0
adăugat
Acest lucru este mult mai bun decât tehnica Excel pe care o folosesc! Mulțumiri!
adăugat autor Liam, sursa
De asemenea, puteți să deschideți fișierul cu un editor decent (de exemplu, vim) și să aplicați o macrocomandă rapidă pe fiecare rând.
adăugat autor Luc M, sursa

Ei bine, dacă este un CSV și acesta este un proces unic, deschideți fișierul în Excel și apoi scrieți formule pentru a popula datele dvs. în orice fel doriți și apoi scrieți o formulă simplă Concat pentru a construi SQL-ul și apoi copiați formula pentru fiecare rând. Veți primi un număr mare de instrucțiuni SQL pe care le puteți executa oriunde doriți.

0
adăugat

Fabio

Am făcut ceea ce a făcut Vaibhav de multe ori și este o metodă bună "rapidă și murdară" de a obține datele într-o bază de date.

Dacă trebuie să faceți acest lucru de câteva ori sau într-un anumit tip de program, atunci o modalitate mai sigură este de a încărca datele CSV "așa cum este" într-o tabelă de lucru (adică customer_dataload) și apoi folosiți instrucțiuni SQL standard pentru a popula lipsesc câmpuri.

(Nu cunosc sintaxa Firebird - dar ceva de genul ...)

UPDATE person
SET id = (SELECT newguid() FROM createguid)

UPDATE person
SET cityid = (SELECT cityid FROM cities WHERE person.cityname = cities.cityname)

etc.

De obicei, este mult mai rapid (și mai fiabil) să obțineți datele în baza de date și apoi să remediați datele decât să încercați să remediați datele în timpul încărcării. De asemenea, beneficiați de tranzacții pentru a vă permite să faceți ROLLBACK dacă nu funcționează!

0
adăugat

Puteți folosi csvsql pentru a face acest lucru.

  • Install it using these instructions
  • Now run a command like so to import your data into your database. More details at the links above, but it'd be something like:

    csvsql --db firebase:///d=mydb --insert mydata.csv

  • The following works with sqlite, and is what I use to convert data into an easy to query format

    csvsql --db sqlite:///dump.db --insert mydata.csv

0
adăugat

Very Simple online Utility : Convert from/to CSV

0
adăugat
Excelent, unele probleme legate de tipurile zecimale.
adăugat autor Kiquenet, sursa
Un instrument mai bun de conversie: codebeautify.org/csv-to-sql-converter
adăugat autor ahgood, sursa

Ați putea importa fișierul CSV într-un tabel ca atare, apoi scrieți o interogare SQL care face toate transformările necesare pe tabela importată și introduce rezultatul în tabela destinație.

Deci, ceva de genul:

<(load the CSV file into temp_table - n, city_name)>

insert into target_table

select t.n, c.city_id as city

from temp_table t, cities c

where t.city_name = c.city_name

Sfat util pentru folosirea programului Excel, dar îți sugerez și să fiu confortabil cu un limbaj de scripting, cum ar fi Python, deoarece pentru o anumită sarcină este mai ușor să scrii doar un script rapid python pentru a face treaba decât să încerci să găsești funcția de care ai nevoie în Excel sau o aplicație pre- care face munca.

0
adăugat

Aș face acest lucru cu awk .

De exemplu, dacă ați avut aceste informații într-un fișier CSV:

Bob,New York
Jane,San Francisco
Steven,Boston
Marie,Los Angeles

Următoarea comandă vă va oferi ceea ce doriți, executați în același director ca fișierul dvs. CSV (numit name-city.csv în acest exemplu).

$ 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

Introduceți awk --help pentru mai multe informații.

0
adăugat
Acest lucru este incredibil de nefolositor. Câteva secunde din timpul petrecut pentru a face un exemplu rapid și murdar ar salva pe cineva care nu știe să folosească mai multe ore.
adăugat autor Anthony, sursa

Puteți încerca fbcopy și instrumente fbexport .

0
adăugat
Acest răspuns este legat de întrebare? Linkul spune fbcopy : Instrument pentru copierea și compararea datelor în bazele de date Firebird
adăugat autor hdoghmen, sursa

Folosesc o ușoară variație în tehnica Excel a lui Balloon.

I highly recommend downloading the free ASAP Utilities plug-in for Excel. One of the many time saving tools they include are insert before current value and insert after current value options.

Acestea ar trebui să vă permită să ajungeți la o soluție mai rapidă, ajutându-vă să vă construiți declarațiile de inserare.

0
adăugat

Un instrument pe care l-am încercat recent, care a lucrat remarcabil, este FSQL .

Scrieți o comandă IMPORT, inserați-o în FSQL și importă fișierul CSV în tabelul Firebird.

0
adăugat

Doar terminat acest script VBA care ar putea fi util în acest scop. Tot ce trebuie să faceți este să modificați instrucțiunea Insert pentru a include tabelul în cauză și lista coloanelor (evident în aceeași ordine în care apar fișierele 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
0
adăugat

Opțiunea 1: 1 - ai încercat IBExert? IBExpert \ Tools \ Import Data (Trial sau Client Version).

opțiunea 2: 2 - încărcați fișierul csv într-o masă temporară cu F_BLOBLOAD. 3 - creați o procedură memorată, care a utilizat 3 funcții (f_stringlength, f_strcopy, f_MID) vă traversați toate șirul, tragând câmpurile pentru a vă construi INSERT INTO.

links: 2: http://freeadhocudf.org/documentation_english/dok_eng_file.html 3: http://freeadhocudf.org/documentation_english/dok_eng_string.html

0
adăugat

use the csv-file as an external table. Then you can use SQL to copy the data from the external table to your destination table - with all the possibilities of SQL. See http://www.firebirdsql.org/index.php?op=useful&id=netzka

0
adăugat
+1 pentru menționarea tabelelor externe, dar rețineți că trebuie să aveți datele în înregistrări și câmpuri cu lungime fixă ​​ca CHAR (n) și trebuie să GRANT privilegiul , și trebuie să permiteți accesul fișierului în firebird.conf folosind ExternalFileAccess = Full și DatabaseAccess = Full .
adăugat autor Lumi, sursa