[SQL Server] Corriger le format d'un fichier CSV

  • Imprimer

-- =============================================

-- Author     : Zouhaier KHARROUBI

-- Create date: 16/03/2016

-- Description: Cette procedure permet de corriger le format d'un fichier CSV

-- Exemple    : Le séparateur du fichier CSV est la virgule ","

--              La présence de la virgule dans une chaine de caractère déformate le format du fichier CSV

--              La procédure permet de remplacer la virgule présente dans les chaines de caractères par des points "."

-- =============================================

--1 Creer la table SAS_FichierCSV

CREATE TABLE [dbo].[SAS_FichierCSV](

      [Num_Lig] [int] IDENTITY(1,1) NOT NULL,

      [Colonne] [nvarchar](max) NULL

) ON [PRIMARY]

--2 Via SSIS remonter le contenu du fichier CSV vers la table SAS_FichierCSV.

-- Remonter tout le contenu du fichier CSV même la première ligne qi contient les liste des colonnes

-- La virgule est le séparateur de colonnes dans le fichier CSV

--3 Corriger le fichier CSV en exécutant la procédure stockée usp_Corriger_FichierCSV

-- Cette procédure permet de remplacer dans les chaines de caractères la virgule par .

--4 Via SSIS remonter le contenu de la table SAS_FichierCSV vers un fichier CSV

-- Remonter que le champ Colonne. Ne pas remonter la colonne Num_Lig

CREATE PROCEDURE [dbo].[usp_CorrigerFormat_FichierCSV]

      -- Add the parameters for the stored procedure here

      @Separateur                       CHAR(1)=','

      ,@Remplacement_separateur    CHAR(1)='.'

      ,@Identificateur_Texte       CHAR(1)='"'

AS

BEGIN

      -- SET NOCOUNT ON added to prevent extra result sets from

      -- interfering with SELECT statements.

      SET NOCOUNT ON;

   -- Insert statements for procedure here

DECLARE @chaine             AS NVARCHAR(MAX)

            ,@chaine_remplacer      AS NVARCHAR(MAX)

            ,@chaine_origine  AS NVARCHAR(MAX)

            ,@debut                      AS INTEGER

            ,@fin                   AS INTEGER

            ,@taille                AS INTEGER

            ,@Nbre_Lig              AS INTEGER

            ,@Num_Lig               AS INTEGER

     

SELECT @Nbre_Lig = COUNT(*) FROM dbo.SAS_FichierCSV

SELECT @Num_Lig = 1

WHILE @Num_Lig <= @Nbre_Lig

      BEGIN

            SELECT @chaine = Colonne FROM dbo.SAS_FichierCSV WHERE Num_Lig=@Num_Lig

           

            SELECT @taille    = LEN(@chaine)

            SELECT @debut     = CHARINDEX(@Identificateur_Texte,@chaine,0)

            SELECT @fin       = CHARINDEX(@Identificateur_Texte,@chaine,@debut + 1)

            WHILE @fin<= @taille and @fin<>0

                  BEGIN

                        SELECT @chaine_origine = SUBSTRING(@chaine,@debut,(@fin - @debut) + 1 )

                        SELECT @chaine_remplacer = @chaine_origine

                       

                        SELECT @chaine_remplacer = REPLACE(@chaine_remplacer,@separateur , @Remplacement_separateur )

                        SELECT @chaine = REPLACE(@chaine,@chaine_origine, @chaine_remplacer)

                       

                        SELECT @debut = CHARINDEX(@Identificateur_Texte,@chaine,@fin+1)

                        IF @debut<>0

                             BEGIN

                                   SELECT @fin = CHARINDEX(@Identificateur_Texte,@chaine,@debut + 1)

                             END

                        ELSE

                             BEGIN

                                   SELECT @fin = 0

                             END

                  END        

           

            UPDATE dbo.SAS_FichierCSV

            SET

                  Colonne = @chaine

            WHERE Num_Lig = @Num_Lig

           

            SELECT @Num_Lig = @Num_Lig + 1

      END

     

END