Je cherche de l'aide pour importer un fichier .csv
dans SQL Server à l'aide de BULK INSERT
et j'ai quelques questions de base.
Problèmes:
Les données du fichier CSV peuvent avoir ,
(virgule) entre les deux (Ex: description), alors comment puis-je importer pour gérer ces données?
Si le client crée le fichier CSV à partir d'Excel, les données avec virgule sont placées entre ""
(guillemets) [comme dans l'exemple ci-dessous]. Comment l'importation peut-elle gérer cela?
Comment pouvons-nous suivre si certaines lignes contiennent des données incorrectes, que l'importation ignore? (l'importation ignore les lignes qui ne sont pas importables)
Voici l'exemple de 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
)
Importation CSV basée sur SQL Server
1) Les données du fichier CSV peuvent avoir
,
(virgule) entre les deux (Exemple: Description). Comment puis-je importer pour gérer ces données?
Solution
Si vous utilisez ,
(virgule) comme délimiteur, il n’ya aucun moyen de faire la différence entre une virgule comme terminateur de champ et une virgule dans vos données. J'utiliserais une FIELDTERMINATOR
différente comme ||
. Le code ressemblerait et cela traiterait parfaitement les virgules et les barres simples.
2) Si le client crée le fichier csv à partir d’Excel, les données contenant le fichier les virgules sont placées entre
" ... "
(guillemets doubles) [comme ci-dessous exemple] alors comment l'importation peut-elle gérer cela?
Solution
Si vous utilisez BULK insert, il n’existe aucun moyen de gérer les guillemets doubles. Les données sont insérées avec des guillemets doubles dans les lignes . Après l’insertion des données dans la table, vous pouvez remplacer ces guillemets par ''.
update table
set columnhavingdoublequotes = replace(columnhavingdoublequotes,'"','')
3) Comment pouvons-nous suivre si certaines lignes ont des données incorrectes, quelles importations seront ignorées? (L'importation ignore-t-elle les lignes non importables)?
Solution
Pour manipuler les lignes qui ne sont pas chargées dans la table à cause d'un format ou de données non valides, vous pouvez utiliser Handle à l'aide de ERRORFILE, propriété , spécifiez le nom du fichier d'erreur. Les lignes Seront écrites. . 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
)
Vous devez d’abord créer une table dans votre base de données dans laquelle vous allez importer 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 bouton Next >
• Pour la source de données, sélectionnez Flat File Source
. Ensuite, utilisez le bouton Parcourir pour sélectionner le fichier CSV. Passez un peu de temps à configurer le mode d'importation des données avant de cliquer sur le bouton Next >
.
• 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. Cochez le bouton radio Use SQL Server Authentication
. Entrez le nom d'utilisateur, le mot de passe et la base de données avant de cliquer sur le bouton Next >
.
• Dans la fenêtre Sélectionner les vues et les tables source, vous pouvez modifier les mappages avant de cliquer sur le bouton Next >
.
• Cochez la case Run immediately
et cliquez sur le bouton Next >
.
• Cliquez sur le bouton Finish
pour exécuter le package.
Ce qui précède a été trouvé sur ce site web (je l’ai utilisé et testé):
2) Si le client crée le fichier csv à partir d’Excel, les données contenant le fichier les virgules sont placées entre "..." (guillemets) [comme ci-dessous exemple] alors comment l'importation peut-elle gérer cela?
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
)
Le meilleur moyen, le plus rapide et le plus simple pour résoudre le problème de virgule dans les données est d’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 tube). Cela générera alors un fichier (ou tout autre fichier) séparé pour vous que vous pourrez ensuite importer. Ceci est décrit ici .
Voici comment je le résoudrais:
Enregistrez simplement votre fichier CSV sous forme de feuille XLS dans Excel (vous ne craindriez plus les délimiteurs. Le format de feuille de calcul Excel sera lu comme un tableau et importé directement dans un tableau SQL)
Importer le fichier en utilisant SSIS
Ecrivez 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.
Vous devez d'abord importer un fichier CSV dans la table de données
Ensuite, vous pouvez insérer des lignes en vrac à 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);
}
}
}
}
}
Importez le fichier dans Excel en ouvrant d'abord Excel, puis en accédant à DONNÉES, puis importez-le à partir du fichier TXT, choisissez l’extension csv qui conservera 0 valeur préfixée, puis enregistrez cette colonne au format TEXT, car Excel supprimera le 0 initial (sinon NE double-cliquez PAS pour ouvrir avec Excel si vous avez des données numériques dans un champ commençant par 0 [0]. Ensuite, enregistrez simplement dans un fichier texte délimité par des tabulations. Lorsque vous importez dans Excel, vous avez la possibilité d'enregistrer en tant que GENERAL, TEXT, etc., choisissez TEXT pour que les guillemets situés au milieu d'une chaîne dans un champ tel que YourCompany, LLC soient également conservé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.
Comme ils n'utilisent pas l'assistant d'importation SQL, les étapes sont les suivantes:
Faites un clic droit sur la base de données dans l'option tasks pour importer les données,
Une fois que l'assistant est ouvert, nous sélectionnons le type de données à impliquer. Dans ce cas, ce serait le
Source de fichier plat
Nous sélectionnons le fichier CSV, vous pouvez configurer le type de données des tables dans le fichier CSV, mais il est préférable de l'apporter à partir du fichier CSV.
Client SQL
En fonction de notre type d'authentification, nous le sélectionnons. Une fois que cela est fait, une option très importante apparaît.
Activer l'identifiant
(généralement pas à partir de 1), si nous avons une colonne avec l'ID dans le fichier CSV, nous sélectionnons l'activation d'insertion d'id, l'étape suivante consiste à mettre fin à l'assistant. Nous pouvons examiner les modifications ici.
D'autre part, dans la fenêtre suivante peuvent apparaître des alertes ou warnings, l'idéal est de l'ignorer, uniquement s'ils laissent une erreur est nécessaire pour faire attention.