web-dev-qa-db-fra.com

Importer un fichier CSV dans SQL Server

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:  

  1. 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? 

  2. 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? 

  3. 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
)
149
Prabhat

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
    )
134
mr_eclair

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é):

23
Zd8n8k

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
)
14
Oleg

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 .

9
Sachin Kainth

Importer un fichier CSV dans une base de données par SQL Server Management Studio.

  1. Commencez par créer une table dans votre base de données dans laquelle vous importerez le fichier CSV. 
  2. Connectez-vous à votre base de données à l'aide de SQL Server Management Studio.
  3. Faites un clic droit sur la base de données et sélectionnez Tâches -> Importer des données ...
  4. Cliquez sur le bouton Suivant>.
  5. Pour Data Source, sélectionnez Flat File Source. Ensuite, utilisez le bouton Parcourir pour sélectionner le fichier CSV. Passez un peu de temps à configurer l’importation des données avant de cliquer sur le bouton Suivant>.
  6. Pour 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 Utiliser l'authentification SQL Server, entrez le nom d'utilisateur, le mot de passe et la base de données avant de cliquer sur le bouton Suivant>.
  7. Dans la fenêtre Sélectionner les vues et les tables source, vous pouvez modifier les correspondances avant de cliquer sur le bouton Suivant>.
  8. Cochez Exécuter immédiatement et cliquez sur le bouton Suivant>. 
  9. Cliquez sur le bouton Terminer pour exécuter le package.

Référence

7
Somnath Muluk

Voici comment je le résoudrais:

  1. 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)

  2. Importer le fichier en utilisant SSIS

  3. 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.

4
Zee

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);
                }
            }
        }
    }
}
2
kombsh

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.

0
Steve Yo

Comme ils n'utilisent pas l'assistant d'importation SQL, les étapes sont les suivantes:

enter image description here

  1. Faites un clic droit sur la base de données dans l'option tasks pour importer les données,

  2. 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.

  1. Cliquez sur Suivant et sélectionnez dans la dernière option qui est

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.

  1. Nous pouvons définir l'identifiant de la table dans le fichier CSV (il est recommandé d'appeler les colonnes du fichier CSV de la même manière que les champs de la table). Dans l'option Modifier les mappages, vous pouvez voir l'aperçu de chaque table avec la colonne de la feuille de calcul. Si nous voulons que l'assistant insère l'ID par défaut, nous laissons cette option non cochée.

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.

Ce lien a des images .

0
jarvis24