Question

Je dois importer un fichier csv dans Oiseau de feu et j'ai passé quelques heures à essayer certains outils et aucun ne correspond à mes besoins.

Le principal problème est que tous les outils que j'ai essayés aiment Importation de données EMS et Assistant de données Firebird attendez-vous à ce que mon fichier CSV contienne toutes les informations nécessaires à ma table.

Je dois écrire du SQL personnalisé dans l'instruction d'insertion, par exemple, j'ai un fichier CSV avec le nom de la ville, mais comme ma base de données contient déjà toutes les villes dans une autre table (normalisée), je dois écrire une sous-sélection dans l'insertion. déclaration pour rechercher la ville et écrire son identifiant, j'ai également une procédure stockée pour créer des GUIDS.

Ma déclaration d'insertion ressemblerait à ceci :

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

Comment puis-je aborder cela ?

Était-ce utile?

La solution

C'est un peu grossier, mais pour des travaux ponctuels, j'utilise parfois Excel.

Si vous importez le fichier CSV dans Excel, vous pouvez créer une formule qui crée une instruction INSERT en utilisant la concaténation de chaînes dans la formule.Donc, si votre fichier CSV comporte 3 colonnes qui apparaissent dans les colonnes A, B et C dans Excel, vous pouvez écrire une formule comme...

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

Ensuite, vous pouvez répliquer la formule sur toutes vos lignes, copier et coller la réponse dans un fichier texte à exécuter sur votre base de données.

Comme je l'ai dit - c'est grossier - mais cela peut être une manière assez « rapide et sale » de faire un travail !

Autres conseils

Eh bien, s'il s'agit d'un CSV et qu'il s'agit d'un processus unique, ouvrez le fichier dans Excel, puis écrivez des formules pour remplir vos données de la manière que vous désirez, puis écrivez une simple formule Concat pour construire votre SQL, et puis copiez cette formule pour chaque ligne.Vous obtiendrez un grand nombre d’instructions SQL que vous pourrez exécuter où vous le souhaitez.

Fabio,

J'ai fait ce que Vaibhav a fait à plusieurs reprises, et c'est un bon moyen "rapide et sale" d'introduire des données dans une base de données.

Si vous devez le faire plusieurs fois ou selon un certain type de calendrier, un moyen plus fiable consiste à charger les données CSV "telles quelles" dans une table de travail (c'est-à-dire customer_dataload), puis à utiliser des instructions SQL standard pour remplir le fichier. champs manquants.

(Je ne connais pas la syntaxe de Firebird - mais quelque chose comme...)

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

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

etc.

Habituellement, il est beaucoup plus rapide (et plus fiable) d'introduire les données DANS la base de données, puis de les corriger, plutôt que d'essayer de les corriger pendant le téléchargement.Vous bénéficiez également de transactions pour vous permettre de ROLLBACK si cela ne fonctionne pas !!

Vous pouvez importer le fichier CSV dans une table tel quel, puis écrire une requête SQL qui effectue toutes les transformations requises sur la table importée et insère le résultat dans la table cible.

Donc quelque chose comme :

<(charger le fichier CSV dans temp_table - n, city_name)>

insérer dans target_table

sélectionnez t.n, c.city_id comme ville

de temp_table t, villes c

où t.city_name = c.city_name

Bon conseil sur l'utilisation d'Excel, mais je suggère également de vous familiariser avec un langage de script comme Python, car pour certaines tâches, il est plus facile d'écrire simplement un script Python rapide pour faire le travail que d'essayer de trouver la fonction dont vous avez besoin dans Excel ou un pré- outil fabriqué qui fait le travail.

utilisez le fichier csv comme table externe.Ensuite, vous pouvez utiliser SQL pour copier les données de la table externe vers votre table de destination – avec toutes les possibilités de SQL.Voir http://www.firebirdsql.org/index.php?op=useful&id=netzka

je ferais ça avec embarrassant.

Par exemple, si vous aviez ces informations dans un fichier CSV :

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

La commande suivante vous donnera ce que vous voulez, exécutez-la dans le même répertoire que votre fichier CSV (nommé name-city.csv dans cet exemple).

$ 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

Taper awk --help pour plus d'informations.

Je viens de terminer ce script VBA qui pourrait être utile à cet effet.Il suffit de modifier l'instruction Insert pour inclure le tableau en question et la liste des colonnes (évidemment dans le même ordre qu'elles apparaissent sur le fichier 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

Vous pouvez utiliser gratuitement csvsql pour faire ça.

  • Installez-le en utilisant ces instructions
  • Exécutez maintenant une commande comme celle-ci pour importer vos données dans votre base de données.Plus de détails sur les liens ci-dessus, mais ce serait quelque chose comme :

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

  • Ce qui suit fonctionne avec SQLite et c'est ce que j'utilise pour convertir les données dans un format facile à interroger

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

Option 1:1- as-tu essayé IBExert ?IBExpert \ Outils \ Importer des données (version d'essai ou client).

Option 2:2- téléchargez votre fichier csv sur une table temporaire avec F_BLOBLOAD.3- Créez une procédure stockée, qui a utilisé 3 fonctions (F_StringLength, F_StrCopy, f_mid) Vous traversez toute votre chaîne, en tirant vos champs pour créer votre insert.

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

Un outil que j'ai récemment essayé et qui a fonctionné à merveille est FSQL.

Vous écrivez une commande IMPORT, collez-la dans FSQL et il importe le fichier CSV dans la table Firebird.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top