Genereer voeg SQL-stellings uit'n CSV-lêer
Vra
Ek nodig het om die invoer van'n csv-lêer in Firebird en ek het spandeer'n paar uur om te probeer om'n paar tools en daar is niemand wat pas my behoeftes.
Die grootste probleem is dat al die gereedskap wat ek het probeer om soos EBW Data Invoer en Firebird Data Wizard verwag dat my CSV-lêer bevat al die inligting wat nodig is deur my Tafel.
Ek nodig het om te skryf'n paar persoonlike SQL in die insetsel verklaring, byvoorbeeld, ek het'n CSV-lêer met die naam van die stad nie, maar as my databasis reeds het al die stede in ander tafel (genormaliseer), ek nodig het om te skryf'n subselect in die insetsel verklaring te soek vir die stad en skryf sy ID, ook ek het'n gestoor proses te cread GUIDS.
My plaas verklaring sou iets soos hierdie:
INSERT INTO PERSON (ID, NAME, CITY_ID) VALUES((SELECT NEW_GUID FROM CREATE_GUID), :NAME, (SELECT CITY_ID FROM CITY WHERE NAME = :CITY_NAME)
Hoe kan ek hierdie benadering?
Oplossing
Dit is'n bietjie ru - maar vir een af werk, het ek soms gebruik Excel.
As jy die invoer van die CSV-lêer in Excel, kan jy skep'n formule wat skep'n INSETSEL verklaring deur gebruik te maak van die string aaneenskakellling in die formule.So - as jou CSV-lêer 3 kolomme wat verskyn in kolomme A, B, en C in Excel, kan jy skryf'n formule soos...
="INSERT INTO MyTable (Col1, Col2, Col3) VALUES (" & A1 & ", " & B1 & ", " & C1 & ")"
Dan kan jy herhaal die formule neer al jou rye, en kopieer en plak die antwoord in'n teks lêer om te hardloop teen jou databasis.
Soos ek sê - dit is ru - maar dit kan nogal'n "vinnige en vuil" manier om'n werk gedoen!
Ander wenke
Wel, as dit is 'n CSV, en dit is dit 'n eenmalige proses, maak die lêer in Excel, en dan skryf formules om jou data te vul in enige manier wat jy wil, en skryf dan 'n eenvoudige Concat formule te bou jou SQL, en dan daardie formule vir elke ry kopieer. Jy sal 'n groot aantal van SQL-stellings wat jy enige plek wat jy wil kan uitvoer nie.
Fabio,
Ek het gedoen wat Vaibhav baie keer gedoen het, en dit is 'n goeie "vinnige en vuil" manier om data te kry in 'n databasis.
As jy nodig het om dit 'n paar keer te doen, of op 'n soort van skedule, dan 'n meer betroubare manier is om die CSV data te laai "as-is" in 'n werk tafel (dit wil sê customer_dataload) en gebruik dan standaard SQL-stellings om die vermiste velde te vul.
(Ek weet nie Firebird sintaksis - maar iets soos ...)
UPDATE person
SET id = (SELECT newguid() FROM createguid)
UPDATE person
SET cityid = (SELECT cityid FROM cities WHERE person.cityname = cities.cityname)
ens.
Gewoonlik, dit is baie vinniger (en meer betroubare) om die data te kry in die databasis en dan die data as los om te probeer om die data tydens die oplaai te los. Jy kry ook die voordeel van transaksies te kan jy terug draai as dit nie werk nie !!
Jy kan die invoer van die CSV in 'n tabel soos dit is, skryf dan 'n SQL navraag wat al die nodige transformasies doen op die ingevoerde tafel en plaas die resultaat in die teiken tafel.
So iets soos:
<(laai die CSV in temp_table - N, CITY_NAME)>
voeg in target_table
Kies t.n, c.city_id as stad
van temp_table t, stede c
waar t.city_name = c.city_name
Nice punt oor die gebruik van Excel, maar ek het ook daarop dui raak gemaklik met 'n script taal soos Python, want vir een of ander taak is dit makliker om net te skryf 'n vinnige python script om die werk te doen as om te probeer om die funksie wat jy nodig het in Excel te vind of 'n-pre gemaak instrument wat die werk doen.
gebruik die CSV-lêer as 'n eksterne tafel. Dan kan jy SQL te gebruik om die data van die eksterne tafel kopieer na jou bestemming tafel - met al die moontlikhede van SQL. Sien http://www.firebirdsql.org/index.php?op=useful&id= netzka
Ek sal dit doen met awk .
Byvoorbeeld, as jy hierdie inligting het in 'n CSV-lêer:
Bob,New York
Jane,San Francisco
Steven,Boston
Marie,Los Angeles
Die volgende opdrag sal gee wat jy wil, loop in dieselfde gids as jou CSV (vernoem name-city.csv
in hierdie voorbeeld).
$ 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
Tik awk --help
vir meer inligting.
Net klaar hierdie VBA script wat handig te pas kom vir dié doel kan wees. Almal moet hoef te doen is verander die Insert verklaring aan die tafel in vraag en die lys van kolomme (natuurlik in dieselfde volgorde hulle op die lêer Excel verskyn) in te sluit.
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
Jy kan die gratis csvsql om dit te doen .
- Installeer dit die gebruik van hierdie instruksies
-
Nou loop 'n bevel soos so na jou data in te voer in jou databasis. Meer besonderhede by die skakels hierbo, maar dit sal so iets wees:
csvsql --db firebase:///d=mydb --insert mydata.csv
-
Die volgende werke met SQLite, en is wat ek gebruik om data te omskep in 'n maklik-formaat te bevraagteken
csvsql --db sqlite:///dump.db --insert mydata.csv
opsie 1: 1- het jy probeer IBExert? IBExpert \ Tools \ Invoer Data (Trial of kliënt weergawe).
opsie 2: 2- laai jou CSV om 'n tydelike tabel met F_BLOBLOAD. 3- skep 'n gestoor proses, wat 3 funksies gebruik (f_stringlength, f_strcopy, f_MID) jy steek jou hele string, trek jou velde om jou te voeg in te bou.
skakels: 2: http://freeadhocudf.org/documentation_english/dok_eng_file.html 3: http://freeadhocudf.org/documentation_english/dok_eng_string.html
'n instrument Ek het onlangs probeer wat gewerk het uitstekend is FSQL .
Jy skryf 'n invoer opdrag, plak dit in FSQL
en dit voer die CSV in die Firebird tafel.