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

VB.NET Discussion :

Lecture CSV et verification ordre des champs


Sujet :

VB.NET

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 44
    Points : 30
    Points
    30
    Par défaut Lecture CSV et verification ordre des champs
    Bonjour à tous.

    Dans l'application que je développe en VB.NET avec une BDD SQL SERVER, je reçois un fichier CSV dont je dois insérer les informations dans ma BDD.

    Le fichier CSV a comme entete les valeurs Champ1, champ2,champ3, ...
    Lorsque j'insère mes données, la table de ma BDD attend les valeurs des champs 1, 2, 3, ... à la suite.

    Mais imaginons que la structure de mon fichier CSV est modifiée (pourquoi faire simple quand on peut faire compliqué ...) et qu'il prend la forme champ1, champ3, champ2, ... Bref, que l'ordre des colonnes est modifié.

    Comment puis-je faire pour que mon application repère le plus automatiquement possible le changement d'ordre des colonnes et qu'elle puisse alerter l'utilisateur et lui demander de choisir parmi les colonnes présentes dans le CSV quelle est la bonne et d'insérer les valeurs correspondantes ?

    Tout celà sachant que mon supérieur n'a pas envi de s'embeter avec changer l'ordre des colonnes physiquement dans le fichier CSV

    J'espere avoir été clair ...


    Cordialement,

    Vincent

  2. #2
    Membre averti Avatar de Sacha999
    Inscrit en
    Mars 2007
    Messages
    294
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mars 2007
    Messages : 294
    Points : 350
    Points
    350
    Par défaut
    - T'ouvre ton fichier au format texte
    - Tu lis la première ligne
    - Tu sais si c'est dans le bon ordre, sinon tu le split et tu proposes au gars la liste des champs dispo

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Tu lis la première ligne pour avoir les noms des champs dans l'ordre
    Tu crées une DataTable, et tu ajoutes une colonne par champ défini dans l'en-tête
    Tu lis chaque ligne du fichier, tu la splites selon le séparateur CSV, et tu mets les valeurs dans les colonnes de la table en accédant aux colonnes par index (et non pas par nom)

    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
    Dim table As New DataTable()
    Using reader As New StreamReader(cheminDuFichier)
     
        Dim header As String = reader.ReadLine()
        Dim columnNames As String() = header.Split(";")
        For Each columnName As String In columnNames
            table.Columns.Add(columnName, GetType(String))
        Next
     
        Dim line As String = reader.ReadLine()
        While line IsNot Nothing
     
            Dim fields As String() = line.Split(";")
            Dim row As DataRow = table.NewRow()
            For i As Integer = 0 To fields.Length - 1
                row(i) = fields(i)
            Next
     
            line = reader.ReadLine()
        End While
     
    End Using
    A la fin, la DataTable contient toutes les valeurs dans les colonnes correspondantes, tu n'as plus qu'à les insérer en base...

  4. #4
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    Merci à vous 2 et en particulier a tomlev

    Le code que tu m'as donnée est parfait pour extraire les données du fichier pour les mettres en 'virtuel' avant de les insérer. Je l'avais déja écrit mais en beaucoup moins propre et en utilisant des tableaux car je ne connaissais pas l'utilisation des Datatable ...

    Mais imagine que la colonne du fichier CSV ait son nom qui a été changé par une personne. Je ne pourrai plus faire la comparaison pour insérer dans ma BDD. Non ?

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par vincent62149 Voir le message
    Mais imagine que la colonne du fichier CSV ait son nom qui a été changé par une personne. Je ne pourrai plus faire la comparaison pour insérer dans ma BDD. Non ?
    Ben j'ai supposé que les colonnes du CSV correspondaient à celle de la table dans la BDD... Si ce n'est pas le cas il te faut un moyen de faire le mapping. Il n'y a aucun moyen de "deviner" que la colonne "toto" du CSV correspond à la colonne "tata" en BDD, il faut que ce soit indiqué quelque part

  6. #6
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    Oui ca je sais bien que c'est impossible mais va faire comprendre ca à mon responsable .

    Il faudrait que le test se fasse, et si les colonnes ne correspondent pas, que la boucle d'insertion s'arrète, demande à l'utilisateur de choisir la colonne qu'il veut et que la boucle reparte avec les valeurs de la colonne sélectionnée.

    C'est possible ca ?

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par vincent62149 Voir le message
    C'est possible ca ?
    Oui bien sûr... mais il faut l'implémenter, ce sera jamais "automagique"

  8. #8
    Membre chevronné Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 693
    Points : 1 961
    Points
    1 961
    Par défaut
    Citation Envoyé par tomlev Voir le message
    ce sera jamais "automagique"
    Moi je prefere auto...wash

  9. #9
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    D'accord ... :p

    Disons que le programme s'éxecute :

    Tout d'abord, il stocke les noms de colonne du fichier CSV. Puis, il compare ces noms de colonne avec les noms de colonne de la table SQL dans laquelle doivent être insérées les données.

    Si la comparaison est OK, le programme enregistre les données de la datatable.
    Si la comparaison échoue, le programme vérifie si le nom de la colonne existe dans les noms de la colonne CSV.

    - Si ce nom existe, c'est que l'ordre des colonnes a été changé
    -> Dans ce cas là, il faut que le programme insère les données correspondantes.

    - Si ce nom n'existe pas, c'est que le nom de la colonne a été changé.
    -> Dans ce cas là, c'est à l'utilisateur de choisir quelle colonne est la bonne

    Pour ces deux points, je n'ai aucune idée du code à implémenter ...

    Avez vous une idée ?

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par vincent62149 Voir le message
    Tout d'abord, il stocke les noms de colonne du fichier CSV. Puis, il compare ces noms de colonne avec les noms de colonne de la table SQL dans laquelle doivent être insérées les données.

    Si la comparaison est OK, le programme enregistre les données de la datatable.
    Si la comparaison échoue, le programme vérifie si le nom de la colonne existe dans les noms de la colonne CSV.

    - Si ce nom existe, c'est que l'ordre des colonnes a été changé
    -> Dans ce cas là, il faut que le programme insère les données correspondantes.

    - Si ce nom n'existe pas, c'est que le nom de la colonne a été changé.
    -> Dans ce cas là, c'est à l'utilisateur de choisir quelle colonne est la bonne

    Pour ces deux points, je n'ai aucune idée du code à implémenter ...
    Pour le premier point, la solution que je t'ai donnée doit faire l'affaire, vu que les données sont stockées dans les colonnes du DataTable avec le nom qui va bien, donc il suffit de les récupérer par nom de colonne lors de l'insertion

    Pour le 2e point, il faut faire une interface pour demander à l'utilisateur de définir le mapping. Par exemple tu présentes une liste des colonnes du CSV, avec sur chaque ligne un ComboBox pour choisir la colonne de la BDD qui correspond. Un DataGridView me semble assez adapté pour faire ça... Ensuite il suffit de changer les noms de colonne du DataTable et de faire comme avant...

Discussions similaires

  1. Ordre des champs insertion csv Mysql
    Par gator dans le forum Langage
    Réponses: 18
    Dernier message: 16/10/2009, 09h29
  2. [Débutant]Ordre des champs dans une table
    Par goony dans le forum Débuter
    Réponses: 4
    Dernier message: 16/02/2006, 13h05
  3. tabulations : définir ordre des champs
    Par Aurèl90 dans le forum Access
    Réponses: 3
    Dernier message: 06/01/2006, 16h30
  4. [débutant] Ordre des champs de saisie par la touche tab
    Par almisuifre dans le forum C++Builder
    Réponses: 10
    Dernier message: 03/03/2005, 20h45
  5. Ordre des champs dans une table
    Par patapetz dans le forum Outils
    Réponses: 5
    Dernier message: 30/07/2003, 07h53

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