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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top