IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Transposer des colonnes en lignes lors de la création d'un fichier csv en vb.net


Sujet :

MS SQL Server

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 10
    Points : 4
    Points
    4
    Par défaut Transposer des colonnes en lignes lors de la création d'un fichier csv en vb.net
    Bonjour,

    J'ai besoin de vos lanternes pour transposer mes lignes en colonnes.

    Mon Problème :

    Je crée un fichier CSV via Vb.net et en fichier de sortie je doit transposer mes colonnes en lignes et donc obtenir quelquechose de ce genre :

    entrée
    ali steve
    1 2
    1 8
    56 43

    sortie
    ali 1 1 56
    steve 2 8 43


    Mon Script



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Imports System
    Imports System.Data
    Imports System.IO
    Imports System.Math
    Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
    Imports Microsoft.SqlServer.Dts.Runtime.Wrapper
     
    Public Class ScriptMain
        Inherits UserComponent
     
        Private ok As Boolean = False
     
     
        Public Overrides Sub Entrée0_ProcessInputRow(ByVal Buffer As Entrée0Buffer)
     
            If ok Then Exit Sub
            'instance du stream writer avec passage du nom du fichier 
     
            Dim monStreamWriter As StreamWriter = New StreamWriter("P:\Bureau\l.csv")
     
            While Buffer.NextRow()
     
                monStreamWriter.WriteLine(Buffer.datecours & ";" & Buffer.codeproduit & ";" & Buffer.Label & ";" & Buffer.Cours & ";" & Buffer.NAV & ";" & Buffer.SPREAD & ";" & Buffer.Devise & ";")
            End While
     
            monStreamWriter.Close()
     
            ok = True
     
        End Sub
     
    End Class
    Merci pour votre aide.

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Soit vous faites la transformation en amont, soit vous réalisez l'import avec SSIS

    @++

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 10
    Points : 4
    Points
    4
    Par défaut Soit vous faites la transformation en amont, soit vous réalisez l'import avec SSIS
    Merci pour votre réponse,

    Si je fais la transformation en amont en sachant que je traite une grande volumétrie de données et que je peux me retrouver avec plus de 10000 colonnes de quelle manière pourrais-je gérer mon script ?

    Le code suscité est un issue d'une tâche de transformation "composant scrip" de SSIS, en suivant votre conseil sur la réalisation de l'import avec SSIS, comment cela se fera-t-il ?

    Si on part sur la base que je ne peux pas utiliser un fichier plat parce que je ne pourrais pas faire des transpositions, les colonnes n'étant pas fixes et assez volumineuses si je réalise la transposition avant importation des données je ne peux pas matcher toutes ces colonnes?

    Avez-vous un exemple svp ?

    Le travail à réaliser consiste en bref à

    - Lire les données issues d'une tables d'une base de données,
    - Créer un fichier CSV et y insérer ces données
    - Transformer ces données et passer des colonnes en lignes
    - Déposer ce fichier dans un répertoire

    Pouvez-vous m'aider je vous prie ?

    Merci.

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Si je fais la transformation en amont en sachant que je traite une grande volumétrie de données et que je peux me retrouver avec plus de 10000 colonnes de quelle manière pourrais-je gérer mon script ?
    10000 colonnes ... techniquement ça va passer, mais ça ne sera pas facile à manipuler en relationnel ...

    Si on part sur la base que je ne peux pas utiliser un fichier plat parce que je ne pourrais pas faire des transpositions, les colonnes n'étant pas fixes et assez volumineuses si je réalise la transposition avant importation des données je ne peux pas matcher toutes ces colonnes?
    Vous pouvez certainement demander à Excel de le faire pour vous, puisqu'on peut transposer avec Excel.

    Malheureusement je n'ai pas d'exemple, ce n'est pas vraiment quelque chose que l'on peut détailler dans un post.
    Avez-vu lu ce billet ?

    @++

  5. #5
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 790
    Points
    6 790
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Vous pouvez certainement demander à Excel de le faire pour vous, puisqu'on peut transposer avec Excel.
    Ta suggestion est limitée par la version de Excel

    Chaque feuille de Microsoft Excel est composée :

    * de 16 384 lignes sur 256 colonnes jusqu'à la version 95 (7.0)
    * de 65 536 lignes sur 256 colonnes jusqu'à la version 2003 (11.0)
    * de 1 048 576 lignes sur 16 384 colonnes pour les versions 2007 et 2010 soit plus de 17 milliards de cellules par feuille (17.179.869.184 exactement)
    donc seuls 2007 et 2010 peuvent répondre au besoin.

    La fonction pivot pourrait être intéressante dans ton cas, mais elle est limitée par la nécessité de préciser les colonnes dans lesquelles les données vont être transposées.

    Mais je trouve que 10 000 Colonnes c'est un peu énorme, déjà que mon SSIS à du mal à traiter parfaitement des fichiers de 140colonnes alors 10 000 je donne pas cher du résultat

    puis.. Qui va lire 10 000 colonnes un script adapté aux besoin serait peut-être plus performant non? Un nombre de colonne variant en fonction des besoins user? ou c'est obligatoirement ce nombre de colonnes qu'il te faut

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 10
    Points : 4
    Points
    4
    Par défaut Réponse
    Merci pour vos réponse,

    Finalement je n'ai plus fait de transposée et je suis passée par un curseur pour passer de 7 colonnes à l'origne à 2 finalement et optimiser sur le nombre de ligne ressorti.

    l'export et la création des fichiers CSV est ainsi plus comode.

    Donc je passe de :

    a b c d e f g
    1 2 3 4 5 6 7
    1 2 3 4 5 8 9

    à

    h 1
    i 2
    j 3
    k 4
    6 7
    8 9


    Via ce script

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
     
    declare @CodeProduit varchar (20) 
          declare @Label varchar (150)			
                declare @Devise char (3)  	 
                      declare @DateVL datetime	
    	           declare @COURS Varchar(30)	
                                declare @NAV Varchar(50)       
                                    declare @Typ Varchar (1)
                                         declare @Isin varchar (20) 
     
     
    set @isin = '?' 
     
     
    IF OBJECT_ID(N'tempdb..#tblResultat', N'U') IS NOT NULL 
    drop table #tblResultat
     
    Create table #tblResultat (
          [id] int IDENTITY (1,1) Primary Key,
          [Libelle] [varchar](150) NOT NULL,
          [Valeur] [varchar](150) NULL)
     
    declare VL_cursor cursor for
    	select 
    									   codeproduit as CodeProduit, 
    									   Label as Label , 
    									   Devise as Devise, 
    									   date_cours as DateVL, 
    									   case when SPREAD <> 0 then cast(cast(round(SPREAD,2) as money) as varchar(30)) else cast(cast(round(Cours,2) as money) as varchar(30)) end as COURS,
    									   cast(cast(round(NAV,2) as money) as Varchar(50))as  NAV,
    									   strType as Typ
    								from  #Cours
    								order by codeproduit ,
    										 date_cours
     
    open VL_cursor
     
    fetch next from VL_cursor
    into @CodeProduit, @Label, @Devise, @DateVL,@COURS,  @NAV 
    set @Isin = '?'
     
    while @@FETCH_STATUS = 0
    begin
         if @Isin <> @CodeProduit  begin --Les 4 premières lignes d'insertion
    					insert into  #tblSSIS (Libelle,Valeur) values ('CODE', @CodeProduit)
    						insert into  #tblSSIS (Libelle,Valeur) values ('LABEL', @Label)     
    							insert into  #tblSSIS (Libelle,Valeur) values ('CUR', @Devise) 							
    								insert into  #tblSSIS (Libelle,Valeur) values ('TYPE', @Typ) 					
    								  --insert into  #tblSSIS (Libelle,Valeur) values ( 'NAV', convert(numeric,@NAV))
    						If @NAV <> '0.00' begin
    									insert into  #tblSSIS (Libelle,Valeur) values ( 'NAV', convert(numeric,@NAV))
    							end							
    			   end --de la première insertion
     
    	set @Isin = @CodeProduit -- insertion des dates et des cours aux dites dates 
     
    										insert into  #tblSSIS (Libelle,Valeur) values (case when day(@DateVL) < 10 then ('0' + cast(day(@DateVL) as char(1))) else cast(day(@DateVL) as char(2))end
    															+ 
    															'/'
    															+
    															case when month(@DateVL) < 10 then ('0' + cast(month(@DateVL) as char(1))) else cast(month(@DateVL) as char(2)) end 
    															+ 
    															'/'
    															+
    															cast(year(@DateVL) as char(4))
     
    															,case when @COURS = '0.00' then '' else @COURS end)
     
     
     
     
    				fetch next from Cours_cursor
     
    			into @CodeProduit, @Label, @Devise, @DateVL, @COURS, @NAV , @Typ
     
    end
     
    		close Cours_cursor
     
    		deallocate Cours_cursor
     
     
    	SELECT 
    						Libelle ,
    						Valeur
    						from #tblSSIS 
    						order by id
    IF OBJECT_ID(N'tempdb..#tblResultat', N'U') IS NOT NULL 
    drop table #tblResultat

    Je vous l'accorde, c'est un peu décorrélé de ma première demande, mais idiot qui ne change pas d'avis quit à se cantonner sur des choses difficilement manipulables, vaut mieux revenir au plus simple.

    La création des fichier via ssis est ainsi plus aisée puisque je ne traite plus que 2 colonnes.

    Merci encore.

  7. #7
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Vous est-il impossible de faire cela côté applicatif ?
    SQL étant un langage ensembliste, il est conçu et optimisé pour manipuler des ... ensembles, donc pas pour faire du ligne à ligne ...
    D'autre part SQL est un langage déclaratif, donc vous spécifiez le résultat que vous voulez obtenir, et non pas l'algorithme pour l'obtenir.
    C'est le travail de SQL Server, et il est bien meilleur qui quiconque pour cela, même s'il a parfois besoin d'un petit coup de pouce d'un DBA

    @++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] transposer des colonnes en lignes d'une manière spéciale
    Par olivverte dans le forum Excel
    Réponses: 2
    Dernier message: 08/08/2014, 13h18
  2. JCL SORT - Transposer des données en lignes en colonne.
    Par aalex_38 dans le forum JCL - SORT
    Réponses: 1
    Dernier message: 06/03/2014, 19h35
  3. [XL-2007] Comment transposer des colonnes en lignes en VBA?
    Par franckimmo dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 12/08/2009, 16h03
  4. [SQL] Transposer des colonnes en lignes + LIKE et SOUNDEX
    Par Anne1969 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 23/11/2005, 14h44
  5. transformer des colonnes en lignes
    Par flonardi dans le forum Oracle
    Réponses: 13
    Dernier message: 28/10/2004, 13h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo