Générer des instructions SQL d'insertion à partir d'un fichier CSV
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 ?
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.