Je recherche de l'aide pour importer un .csv
fichier dans SQL Server en utilisant BULK INSERT
et j'ai quelques questions de base.
Problèmes:
Les données du fichier CSV peuvent avoir
,
(virgule) entre (Ex: description), alors comment puis-je effectuer une importation en gérant ces données?Si le client crée le CSV à partir d'Excel, les données contenant des virgules sont placées entre
""
(guillemets) [comme l'exemple ci-dessous]. Comment l'importation peut-elle gérer cela?Comment pouvons-nous savoir si certaines lignes contiennent des données incorrectes, quelles importations ignorent? (importe-t-il les lignes qui ne sont pas importables)
Voici l'exemple CSV avec en-tête:
Name,Class,Subject,ExamDate,Mark,Description
Prabhat,4,Math,2/10/2013,25,Test data for prabhat.
Murari,5,Science,2/11/2013,24,"Test data for his's test, where we can test 2nd ROW, Test."
sanjay,4,Science,,25,Test Only.
Et instruction SQL à importer:
BULK INSERT SchoolsTemp
FROM 'C:\CSVData\Schools.csv'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = ',', --CSV field delimiter
ROWTERMINATOR = '\n', --Use to shift the control to next row
TABLOCK
)
sql
sql-server
csv
bulkinsert
bulk
Prabhat
la source
la source
BULK NSERT
ou n'avez pas les autorisations pour cela).Réponses:
Importation CSV SQL Server basée
Solution
Si vous utilisez
,
(virgule) comme délimiteur, il n'y a aucun moyen de faire la différence entre une virgule comme terminateur de champ et une virgule dans vos données. J'utiliserais un autreFIELDTERMINATOR
comme||
. Le code ressemblerait à ce qui gérera parfaitement la virgule et la barre oblique simple.Solution
Si vous utilisez l'insertion BULK, il n'y a aucun moyen de gérer les guillemets doubles, les données seront insérées avec des guillemets doubles dans les lignes. après avoir inséré les données dans le tableau, vous pouvez remplacer ces guillemets doubles par «
».
update table set columnhavingdoublequotes = replace(columnhavingdoublequotes,'"','')
Solution
Pour gérer les lignes qui ne sont pas chargées dans la table en raison de données ou d'un format non valides, peuvent être traitées à l' aide de la propriété ERRORFILE , spécifiez le nom du fichier d'erreur, il écrira les lignes contenant des erreurs dans le fichier d'erreur. le code devrait ressembler à.
BULK INSERT SchoolsTemp FROM 'C:\CSVData\Schools.csv' WITH ( FIRSTROW = 2, FIELDTERMINATOR = ',', --CSV field delimiter ROWTERMINATOR = '\n', --Use to shift the control to next row ERRORFILE = 'C:\CSVDATA\SchoolsErrorRows.csv', TABLOCK )
la source
Vous devez d'abord créer une table dans votre base de données dans laquelle vous importerez le fichier CSV. Une fois la table créée, suivez les étapes ci-dessous.
• Connectez-vous à votre base de données à l’aide de SQL Server Management Studio
• Faites un clic droit sur votre base de données et sélectionnez
Tasks -> Import Data...
• Cliquez sur le
Next >
bouton• Pour la source de données, sélectionnez
Flat File Source
. Utilisez ensuite le bouton Parcourir pour sélectionner le fichier CSV. Passez un peu de temps à configurer la façon dont vous voulez que les données soient importées avant de cliquer sur leNext >
bouton.• Pour la destination, sélectionnez le fournisseur de base de données approprié (par exemple pour SQL Server 2012, vous pouvez utiliser SQL Server Native Client 11.0). Entrez le nom du serveur. Vérifiez le
Use SQL Server Authentication
bouton radio. Entrez le nom d'utilisateur, le mot de passe et la base de données avant de cliquer sur leNext >
bouton.• Dans la fenêtre Sélectionner les tables et vues source, vous pouvez modifier les mappages avant de cliquer sur le
Next >
bouton.• Cochez la
Run immediately
case et cliquez sur leNext >
bouton.• Cliquez sur le
Finish
bouton pour exécuter le package.Ce qui précède a été trouvé sur ce site Web (je l'ai utilisé et testé):
la source
Vous devez utiliser les options FORMAT = 'CSV', FIELDQUOTE = '"':
BULK INSERT SchoolsTemp FROM 'C:\CSVData\Schools.csv' WITH ( FORMAT = 'CSV', FIELDQUOTE = '"', FIRSTROW = 2, FIELDTERMINATOR = ',', --CSV field delimiter ROWTERMINATOR = '\n', --Use to shift the control to next row TABLOCK )
la source
Le moyen le meilleur, le plus rapide et le plus simple de résoudre le problème de virgule dans les données consiste à utiliser Excel pour enregistrer un fichier séparé par des virgules après avoir défini le paramètre de séparateur de liste de Windows sur autre chose qu'une virgule (telle qu'un tuyau). Cela générera ensuite un fichier séparé par un tube (ou autre) que vous pourrez ensuite importer. Ceci est décrit ici .
la source
Premièrement, vous devez importer un fichier CSV dans la table de données
Ensuite, vous pouvez insérer des lignes en bloc à l'aide de SQLBulkCopy
using System; using System.Data; using System.Data.SqlClient; namespace SqlBulkInsertExample { class Program { static void Main(string[] args) { DataTable prodSalesData = new DataTable("ProductSalesData"); // Create Column 1: SaleDate DataColumn dateColumn = new DataColumn(); dateColumn.DataType = Type.GetType("System.DateTime"); dateColumn.ColumnName = "SaleDate"; // Create Column 2: ProductName DataColumn productNameColumn = new DataColumn(); productNameColumn.ColumnName = "ProductName"; // Create Column 3: TotalSales DataColumn totalSalesColumn = new DataColumn(); totalSalesColumn.DataType = Type.GetType("System.Int32"); totalSalesColumn.ColumnName = "TotalSales"; // Add the columns to the ProductSalesData DataTable prodSalesData.Columns.Add(dateColumn); prodSalesData.Columns.Add(productNameColumn); prodSalesData.Columns.Add(totalSalesColumn); // Let's populate the datatable with our stats. // You can add as many rows as you want here! // Create a new row DataRow dailyProductSalesRow = prodSalesData.NewRow(); dailyProductSalesRow["SaleDate"] = DateTime.Now.Date; dailyProductSalesRow["ProductName"] = "Nike"; dailyProductSalesRow["TotalSales"] = 10; // Add the row to the ProductSalesData DataTable prodSalesData.Rows.Add(dailyProductSalesRow); // Copy the DataTable to SQL Server using SqlBulkCopy using (SqlConnection dbConnection = new SqlConnection("Data Source=ProductHost;Initial Catalog=dbProduct;Integrated Security=SSPI;Connection Timeout=60;Min Pool Size=2;Max Pool Size=20;")) { dbConnection.Open(); using (SqlBulkCopy s = new SqlBulkCopy(dbConnection)) { s.DestinationTableName = prodSalesData.TableName; foreach (var column in prodSalesData.Columns) s.ColumnMappings.Add(column.ToString(), column.ToString()); s.WriteToServer(prodSalesData); } } } } }
la source
Voici comment je le résoudrais:
Enregistrez simplement votre fichier CSV en tant que feuille XLS dans Excel (ce faisant, vous n'aurez pas à vous soucier des délimiteurs. Le format de feuille de calcul Excel sera lu comme un tableau et importé directement dans un tableau SQL)
Importer le fichier à l'aide de SSIS
Écrivez un script personnalisé dans le gestionnaire d'importation pour omettre / modifier les données que vous recherchez (ou exécutez un script maître pour examiner les données que vous souhaitez supprimer)
Bonne chance.
la source
Comme ils n'utilisent pas l'assistant d'importation SQL, les étapes seraient les suivantes:
Faites un clic droit sur la base de données dans les tâches d' option pour importer des données,
Une fois l'assistant ouvert, nous sélectionnons le type de données à impliquer. Dans ce cas, ce serait le
Nous sélectionnons le fichier CSV, vous pouvez configurer le type de données des tables dans le CSV, mais il est préférable de l'apporter à partir du CSV.
En fonction de notre type d'authentification, nous le sélectionnons, une fois que cela est fait, une option très importante vient.
(généralement pas à partir de 1), à la place, si nous avons une colonne avec l'id dans le CSV, nous sélectionnons l'insertion d'id d'activation, l'étape suivante consiste à mettre fin à l'assistant, nous pouvons examiner les modifications ici.
D'autre part, dans la fenêtre suivante peuvent venir des alertes, ou des avertissements l'idéal est d'ignorer cela, seulement s'ils laissent une erreur est nécessaire de faire attention.
Ce lien contient des images .
la source
Je sais que ce n'est pas la solution exacte à la question ci-dessus, mais pour moi, c'était un cauchemar lorsque j'essayais de copier des données d'une base de données située sur un serveur séparé vers mon local.
J'essayais de le faire en exportant d' abord les données du serveur vers
CSV/txt
, puis en les important dans ma table locale.Les deux solutions: écrire la requête à importer
CSV
ou utiliser l' assistant d' importation de données SSMS produisait toujours des erreurs (les erreurs étaient très générales, indiquant qu'il y avait un problème d'analyse). Et même si je ne faisais rien de spécial, juste exporter versCSV
et ensuite essayer d' importerCSV
vers le localDB
, les erreurs étaient toujours là.J'essayais de regarder la section de cartographie et l'aperçu des données, mais il y avait toujours un gros désordre. Et je sais que le problème principal venait de l'une des
table
colonnes, qui contenaitJSON
et l'SQL
analyseur traitait cela de manière incorrecte.Donc finalement, j'ai trouvé une solution différente et je veux la partager au cas où quelqu'un d'autre aurait un problème similaire.
Ce que j'ai fait, c'est que j'ai utilisé l' assistant d'exportation sur le serveur externe.
Voici les étapes pour répéter le même processus:
1) Faites un clic droit sur la base de données et sélectionnez
Tasks -> Export Data...
2) Lorsque l'assistant s'ouvre, choisissez Suivant et à la place de "Source de données:" choisissez "SQL Server Native Client".
3) Après avoir appuyé sur Suivant , vous devez sélectionner la Destionation .
Pour cela, sélectionnez à nouveau "SQL Server Native Client".
Cette fois, vous pouvez fournir votre local (ou un autre externe
DB
)DB
.4) Après avoir cliqué sur le bouton Suivant, vous avez deux options pour copier la table entière de l'un
DB
à l'autre ou pour écrire la requête pour spécifier les données exactes à copier. Dans mon cas, je n'avais pas besoin de la table entière (elle était trop grande), mais juste d'une partie de celle-ci, j'ai donc choisi «Ecrire une requête pour spécifier les données à transférer».5) Et enfin, vous devez spécifier la table de destination où les données seront sélectionnées.
Et maintenant, allez directement à la fin de l'assistant en appuyant sur les boutons Suivant / Terminer .
la source
Importez le fichier dans Excel en ouvrant d'abord excel, puis en accédant à DATA, importez à partir du fichier TXT, choisissez l'extension csv qui conservera 0 valeurs préfixées et enregistrez cette colonne en tant que TEXT car Excel supprimera le 0 de début sinon (NE double-cliquez pas à ouvrir avec Excel si vous avez des données numériques dans un champ commençant par 0 [zéro]). Ensuite, enregistrez simplement sous forme de fichier texte délimité par des tabulations. Lorsque vous importez dans Excel, vous obtenez une option pour enregistrer en tant que GENERAL, TEXT, etc. choisissez TEXT afin que les guillemets au milieu d'une chaîne dans un champ comme YourCompany, LLC soient également préservés ...
BULK INSERT dbo.YourTableName FROM 'C:\Users\Steve\Downloads\yourfiletoIMPORT.txt' WITH ( FirstRow = 2, (if skipping a header row) FIELDTERMINATOR = '\t', ROWTERMINATOR = '\n' )
J'aimerais pouvoir utiliser les fonctionnalités FORMAT et Fieldquote mais cela ne semble pas être pris en charge dans ma version de SSMS
la source
Je sais qu'il y a des réponses acceptées mais je veux quand même partager mon scénario qui aidera peut-être quelqu'un à résoudre son problème OUTILS
SCÉNARIO Je chargeais l'ensemble de données qui est au format CSV qui devait plus tard être affiché sur la vue J'ai essayé d'utiliser le chargement en bloc mais je ne peux pas charger comme je l'
BULK LOAD
utilisaiset la cellule Excel utilisait également
,
cependant, je ne pouvais pas non plus utiliserFlat file source
directement parce que j'utilisaisCode-First Approach
et faisais ce modèle uniquement dans SSMS DB, pas dans le modèle à partir duquel j'ai dû utiliser les propriétés plus tard.SOLUTION
Add-Migration
dans la console du package NuGetla source
Peut-être SSMS: Comment importer (copier / coller) des données d'Excel peut aider (si vous ne voulez pas utiliser
BULK INSERT
ou n'avez pas les autorisations pour cela).la source
Toutes les réponses ici fonctionnent très bien si vos données sont «propres» (aucune violation de contrainte de données, etc.) et que vous avez accès à la mise du fichier sur le serveur. Certaines des réponses fournies ici s'arrêtent à la première erreur (violation PK, erreur de perte de données, etc.) et vous donnent une erreur à la fois si vous utilisez la tâche d'importation intégrée de SSMS. Si vous souhaitez rassembler toutes les erreurs en même temps (au cas où vous voudriez dire à la personne qui vous a donné le fichier .csv de nettoyer ses données), je recommande ce qui suit comme réponse. Cette réponse vous donne également une flexibilité totale lorsque vous «écrivez» vous-même le SQL.
Remarque: je vais supposer que vous utilisez un système d'exploitation Windows et que vous avez accès à Excel et SSMS. Sinon, je suis sûr que vous pouvez modifier cette réponse en fonction de vos besoins.
À l'aide d'Excel, ouvrez votre fichier .csv. Dans une colonne vide, vous écrirez une formule qui construira des
INSERT
déclarations individuelles comme=CONCATENATE("INSERT INTO dbo.MyTable (FirstName, LastName) VALUES ('", A1, "', '", B1,"')", CHAR(10), "GO")
où A1 est une cellule qui a les données de prénom et A2 a les données de nom par exemple.CHAR(10)
ajoute un caractère de nouvelle ligne au résultat final etGO
nous permettra de l'exécuterINSERT
et de passer au suivant même s'il y a des erreurs.Mettez en surbrillance la cellule avec votre
=CONCATENATION()
formuleShift + End pour mettre en évidence la même colonne dans le reste de vos lignes
Dans le ruban> Accueil> Edition> Remplir> Cliquez vers le bas
Ctrl + C pour copier les
INSERT
instructions SQL formuléesColler dans SSMS
Vous remarquerez qu'Excel, probablement de manière inattendue, a ajouté des guillemets doubles autour de chacune de vos commandes
INSERT
etGO
. Il s'agit d'une "fonctionnalité" (?) De copie de valeurs multilignes hors d'Excel. Vous pouvez simplement trouver et remplacer"INSERT
etGO"
avecINSERT
etGO
respectivement pour nettoyer cela.Enfin, vous êtes prêt à exécuter votre processus d'importation
Une fois le processus terminé, vérifiez la fenêtre Messages pour toute erreur. Vous pouvez sélectionner tout le contenu (Ctrl + A) et copier dans Excel et utiliser un filtre de colonne pour supprimer tous les messages réussis et vous vous retrouvez avec toutes les erreurs.
Ce processus prendra certainement plus de temps que les autres réponses ici, mais si vos données sont «sales» et pleines de violations SQL, vous pouvez au moins rassembler toutes les erreurs en même temps et les envoyer à la personne qui vous a fourni les données, si cela est votre scénario.
la source