Generieren Sie SQL-Anweisungen zum Einfügen aus einer CSV-Datei
Frage
Ich muss eine CSV-Datei importieren Feuervogel und ich habe ein paar Stunden damit verbracht, einige Tools auszuprobieren, aber keines entsprach meinen Anforderungen.
Das Hauptproblem besteht darin, dass alle Tools, die ich ausprobiert habe, mir gefallen EMS-Datenimport Und Firebird-Datenassistent Erwarten Sie, dass meine CSV-Datei alle von meiner Tabelle benötigten Informationen enthält.
Ich muss einige benutzerdefinierte SQL-Anweisungen in die Einfügeanweisung schreiben. Ich habe beispielsweise eine CSV-Datei mit dem Städtenamen, aber da meine Datenbank bereits alle Städte in einer anderen Tabelle (normalisiert) enthält, muss ich eine Unterauswahl in die Einfügeanweisung schreiben Anweisung, um nach der Stadt zu suchen und ihre ID zu schreiben, außerdem habe ich eine gespeicherte Prozedur zum Erstellen von GUIDS.
Meine insert-Anweisung würde etwa so aussehen:
INSERT INTO PERSON (ID, NAME, CITY_ID) VALUES((SELECT NEW_GUID FROM CREATE_GUID), :NAME, (SELECT CITY_ID FROM CITY WHERE NAME = :CITY_NAME)
Wie kann ich das angehen?
Lösung
Es ist etwas grob, aber für einmalige Aufträge verwende ich manchmal Excel.
Wenn Sie die CSV-Datei in Excel importieren, können Sie eine Formel erstellen, die eine INSERT-Anweisung erstellt, indem Sie die Zeichenfolgenverkettung in der Formel verwenden.Wenn Ihre CSV-Datei also drei Spalten enthält, die in den Spalten A, B und C in Excel erscheinen, könnten Sie eine Formel wie ... schreiben.
="INSERT INTO MyTable (Col1, Col2, Col3) VALUES (" & A1 & ", " & B1 & ", " & C1 & ")"
Anschließend können Sie die Formel in allen Zeilen reproduzieren und die Antwort kopieren und in eine Textdatei einfügen, um sie in Ihrer Datenbank auszuführen.
Wie ich schon sagte – es ist grob – aber es kann eine ziemlich „schnelle und schmutzige“ Art sein, eine Arbeit zu erledigen!
Andere Tipps
Wenn es sich um eine CSV-Datei handelt und dies ein einmaliger Vorgang ist, öffnen Sie die Datei in Excel und schreiben Sie dann Formeln, um Ihre Daten auf die von Ihnen gewünschte Weise aufzufüllen. Schreiben Sie dann eine einfache Concat-Formel, um Ihr SQL zu erstellen, und Kopieren Sie dann diese Formel für jede Zeile.Sie erhalten eine große Anzahl von SQL-Anweisungen, die Sie an jedem beliebigen Ort ausführen können.
Fabio,
Ich habe das, was Vaibhav getan hat, viele Male getan, und es ist eine gute „schnelle und schmutzige“ Möglichkeit, Daten in eine Datenbank zu übertragen.
Wenn Sie dies einige Male oder nach einem bestimmten Zeitplan tun müssen, ist es zuverlässiger, die CSV-Daten „wie sie sind“ in eine Arbeitstabelle (z. B. customer_dataload) zu laden und sie dann mit Standard-SQL-Anweisungen zu füllen fehlende Felder.
(Ich kenne die Firebird-Syntax nicht – aber so etwas wie ...)
UPDATE person
SET id = (SELECT newguid() FROM createguid)
UPDATE person
SET cityid = (SELECT cityid FROM cities WHERE person.cityname = cities.cityname)
usw.
Normalerweise ist es viel schneller (und zuverlässiger), die Daten in die Datenbank zu übertragen und sie dann zu reparieren, als zu versuchen, die Daten während des Hochladens zu reparieren.Sie profitieren auch von den Vorteilen von Transaktionen, die Ihnen ein ROLLBACK ermöglichen, wenn es nicht funktioniert!!
Sie können die CSV-Datei unverändert in eine Tabelle importieren und dann eine SQL-Abfrage schreiben, die alle erforderlichen Transformationen für die importierte Tabelle durchführt und das Ergebnis in die Zieltabelle einfügt.
Also so etwas wie:
<(Laden Sie die CSV-Datei in temp_table - n, city_name)>
in target_table einfügen
Wählen Sie t.n, c.city_id als Stadt aus
aus temp_table t, Städte c
wobei t.city_name = c.city_name
Netter Tipp zur Verwendung von Excel, aber ich empfehle auch, sich mit einer Skriptsprache wie Python vertraut zu machen, denn für manche Aufgaben ist es einfacher, einfach ein schnelles Python-Skript zu schreiben, um die Aufgabe zu erledigen, als zu versuchen, die benötigte Funktion in Excel oder einem Vorprogramm zu finden. gemachtes Werkzeug, das die Arbeit erledigt.
Verwenden Sie die CSV-Datei als externe Tabelle.Anschließend können Sie mit SQL die Daten aus der externen Tabelle in Ihre Zieltabelle kopieren – mit allen Möglichkeiten von SQL.Sehen http://www.firebirdsql.org/index.php?op=useful&id=netzka
Ich würde das mit machen awk.
Wenn Sie diese Informationen beispielsweise in einer CSV-Datei hätten:
Bob,New York
Jane,San Francisco
Steven,Boston
Marie,Los Angeles
Der folgende Befehl gibt Ihnen das, was Sie wollen. Führen Sie ihn im selben Verzeichnis aus wie Ihre CSV-Datei (mit dem Namen name-city.csv
in diesem Beispiel).
$ 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
Typ awk --help
für mehr Informationen.
Habe gerade dieses VBA-Skript fertiggestellt, das für diesen Zweck nützlich sein könnte.Alles, was Sie tun müssen, ist, die Insert-Anweisung so zu ändern, dass sie die betreffende Tabelle und die Liste der Spalten enthält (natürlich in derselben Reihenfolge, in der sie in der Excel-Datei erscheinen).
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
Sie können das kostenlose nutzen csvsql um dies zu tun.
- Es installieren unter Verwendung dieser Anleitung
Führen Sie nun einen Befehl wie diesen aus, um Ihre Daten in Ihre Datenbank zu importieren.Weitere Details finden Sie unter den Links oben, aber es wäre etwa so:
csvsql --db firebase:///d=mydb --insert mydata.csv
Das Folgende funktioniert mit SQLite und ist das, was ich verwende, um Daten in ein einfach abzufragendes Format zu konvertieren
csvsql --db sqlite:///dump.db --insert mydata.csv
Option 1:1- Haben Sie IBExert ausprobiert?IBExpert \ Tools \ Daten importieren (Testversion oder Kundenversion).
Option 2:2- Laden Sie Ihre CSV-Datei mit F_BLOBLOAD in eine temporäre Tabelle hoch.3- Erstellen Sie eine gespeicherte Prozedur, bei der 3 Funktionen (f_stringLength, f_strcopy, f_mid) Sie alle Ihre Saite überqueren und Ihre Felder zum Erstellen Ihres Einsatzes ziehen.
Links:2: http://freeadhocudf.org/documentation_english/dok_eng_file.html 3: http://freeadhocudf.org/documentation_english/dok_eng_string.html
Ein Tool, das ich kürzlich ausprobiert habe und das hervorragend funktioniert hat, ist FSQL.
Sie schreiben einen IMPORT-Befehl und fügen ihn ein FSQL
und es importiert die CSV-Datei in die Firebird-Tabelle.