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 :

Utilisation de split


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    IT Manager
    Inscrit en
    Janvier 2018
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Manager
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2018
    Messages : 220
    Par défaut Utilisation de split
    Bonjour,

    J'ai un problème avec la fonction split et je tourne en rond sans solution.
    Voici une ligne de données dans un csv :
    2020-11-02_151024_3,203031025910,B03,14,Patient,5000,10000,5,5,,,,"32,98874",NEGATIVE,NEGATIVE,NEGATIVE,NEGATIVE,39,39,39,22,INVALID,NA,RETEST

    Je lis le csv dans un streamreader et j'utilise split pour aller chercher ce qui m'intéresse.
    Avant, je retire les guillemets :
    2020-11-02_151024_3,203031025910,B03,14,Patient,5000,10000,5,5,,,,32,98874,NEGATIVE,NEGATIVE,NEGATIVE,NEGATIVE,39,39,39,22,INVALID,NA,RETEST

    J'ai besoin d'aller récupérer la valeur 32,98874 mais comme le symbole de séparateur décimale est une virgule, la fonction split me rend de mauvaises données vu qu'elle décale tout.
    Sur le logiciel qui extrait le csv il n'est apparemment pas possible de changer de séparateur pour un point virgule ni de changer le symbole de décimale vers point.

    Est-ce que quelqu'un connait une entourloupe pour ça ? ou bien je l'ai profond dans l'arrière gorge?

  2. #2
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,

    Le problème est faire la distinction entre la virgule séparateur décimal et la virgule séparateur de champs. Si tu peux faire cela, il t'est possible de faire une petite "routine" qui remplace une des virgules par autre chose : la virgule séparateur décimal par un point, la virgule séparateur de champs par un point-virgule.
    Mais tout cela, tu le sais déjà !

    Ne t'est-il pas possible d'agir sur la production du fichier CSV et faire en sorte que le séparateur soit un point-virgule (comme avec un "vrai" CSV) ?

    Autre piste, si tu peux connaitre à l'avance les types des données (parce qu'ils seraient toujours dans le même ordre), il est possible de "décortiquer" la chaîne de sorte à savoir quand la virgule est séparateur décimal ou séparateur de champs.

    Je sais que je ne t'apporte pas de solution mais peut-être des pistes de réflexions ...

  3. #3
    Membre expérimenté
    Homme Profil pro
    IT Manager
    Inscrit en
    Janvier 2018
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Manager
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2018
    Messages : 220
    Par défaut
    Bin non, justement il est impossible de savoir si c'est une virgule qui sépare une décimale ou un champ...
    Pour le streamreader, virgule, c'est virgule...

    Et d'après l'opérateur de la machine il n'est pas possible d'extraire le csv en point-virgule...
    Ce que je trouve étrange.
    Je vais jeter un oeil moi même aux possibilités d'export.
    Ce qui est peut-etre possible c'est d'extraire d'abord en excel et ensuite enregistrer l'excel en csv point virgule.

    J'espérais qu'un vieux roublard du .NET aurait déjà été face à ce problème là et me filerait un truc farfelu pour le faire mais visiblement ce n'est pas possible, et ça ne m'étonne pas...

  4. #4
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    Salut

    Moi je lirais ligne par ligne, pour chaque lignes je ferai un split sur les ", je récupère l'index 1 du tableau, puis comme dit par Phil Rob, tu modifies à ta convenance la virgule par un point avec un Replace.
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  5. #5
    Membre expérimenté
    Homme Profil pro
    IT Manager
    Inscrit en
    Janvier 2018
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Manager
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2018
    Messages : 220
    Par défaut
    ça serait trop facile....
    mais.... les données peuvent bouger dans le csv... d'un export à l'autre, elles peuvent changer de place...

    Je dois donc au préalable lire la ligne d'entête de colonne, trouver dans quelle colonne se trouve chaque donnée que j'ai besoin d'extraire et ensuite spliter sur la xiem virgule...
    Parfois elles sont entourées de guillemets, parfois non....

    En bref, c'est pas stable

  6. #6
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Autre piste, si tu peux connaitre à l'avance les types des données (parce qu'ils seraient toujours dans le même ordre), il est possible de "décortiquer" la chaîne de sorte à savoir quand la virgule est séparateur décimal ou séparateur de champs.
    Tu n'as pet-être pas lu cette phrase que j'ai ajoutée plus tard au message.

    Vois cet exemple :

    2020-11-02_151024_3,203031025910,B03,14,Patient,5000,10000,5,5,,,,32,98874,NEGATIVE,NEGATIVE,NEGATIVE,NEGATIVE,39,39,39,22,INVALID,NA,RETEST

    Le split donne le tableau de chaines Tmp() et voilà ce que je te propose :

    Tmp(0) : c'est une chaine réprésentant un code 2020-11-02_151024_3
    Tmp(1) : c'est une chaine de chiffres 203031025910
    Tmp(2) : c'est une chaine quelconque B03
    Tmp(3) : c'est une chaine de chiffres 14
    Tmp(4) : c'est une chaine quelconque Patient
    ...
    Tmp(12) : c'est une chaine de chiffres 32 =======> c'est la partie entière d'un réel
    Tmp(13) : c'est une chaine de chiffres 98874 =======> c'est la partie décimale du réel
    ...

  7. #7
    Membre expérimenté
    Homme Profil pro
    IT Manager
    Inscrit en
    Janvier 2018
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Manager
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2018
    Messages : 220
    Par défaut
    Non justement, les colonnes sont susceptibles de bouger d'un export à l'autre -_-

  8. #8
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Citation Envoyé par thovan Voir le message
    Non justement, les colonnes sont susceptibles de bouger d'un export à l'autre -_-
    Peut-être que la première ligne du fichier contient les noms des champs ? Comme si s'était une feuille XLS ?

  9. #9
    Membre expérimenté
    Homme Profil pro
    IT Manager
    Inscrit en
    Janvier 2018
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Manager
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2018
    Messages : 220
    Par défaut
    Citation Envoyé par Phil Rob Voir le message
    Peut-être que la première ligne du fichier contient les noms des champs ? Comme si s'était une feuille XLS ?
    Oui, voici comment ça marche :

    En résumé, l'application est un traducteur pour des résultats de PCR Covid 19.
    La machine fait la PCR et rend le CSV.

    Le traducteur prend le CSV pour y extraire les données et les reformater au format BARCODE;TESTCODE;VALEUR;
    Ensuite, le fichier traduit est intégré dans le système principal et rattaché au dossier du patient.

    Comme les colonnes peuvent bouger, j'ai un fichier de config dans lequel je précise le nom de chaque colonne que je cherche.
    Une 1ere série de boucle lit la ligne d'entête à la recherche des positions sur base d'un split(",") dans la ligne.
    Une 2e boucle lit le reste du fichier et extrait les données au index déterminés.
    Mais quand il arrive dans la colonne du résultat, et que ce résultat à une virgule en décimale, il split un caractère trop tot et coupe le chiffre en deux.

  10. #10
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Suite ...

    ... les données peuvent bouger dans le csv... d'un export à l'autre, elles peuvent changer de place...
    On ne peut pas extraire des données sans savoir ce qu'elles sont ni à quoi elles servent. Les données que tu extrais sont sûrement destinées à des zones d'affichages, ou des champs de DB, ou des variables en vue de calculs, ...
    Cela n'est pas possible si tu n'as pas l'information de la signification des données : on ne peut afficher le nom d'une personne à la place son prénom, ni son prénom à la place de son lieu de naissance, ni le montant à lui payer à la place de sa date de naissance, ...

    ...

  11. #11
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    OK, il devrait donc être possible que traiter ce résultat tronqué sur la base de mon exemple :

    Tmp(12) : c'est une chaine de chiffres 32 =======> c'est la partie entière d'un réel
    Tmp(13) : c'est une chaine de chiffres 98874 =======> c'est la partie décimale du réel


    Chaque virgule provoque une insertion dans la table Tmp() (de mon exemple). Et sachant à quelle valeur attendre à un moment donné, il devrait être possible de retrouver les parties entière et décimale du nombre réel, et de reconstituer ce réel.

    ...

  12. #12
    Membre expérimenté
    Homme Profil pro
    IT Manager
    Inscrit en
    Janvier 2018
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Manager
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2018
    Messages : 220
    Par défaut
    haha, oui en effet...
    C'est barbare mais ça devrait marcher....
    A condition que ce soit bien toujours une virgule qui sépare les décimales...
    Et chez nous je ne sais pas comment ils font mais il arrive qu'une fois ce soit virgule, une fois point.... -_-

    Je pense que le mieux, c'est traiter manuellement pour corriger le format avant l'import...
    A partir du moment ou la structure et le format ne sont pas stables, il ne peut y avoir de miracle.... non ?

  13. #13
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    c'est traiter manuellement pour corriger le format avant l'import..
    A ce moment tu as toujours le même problème. C'est pourquoi, perso, je travaillerais sur la table résultat du split, en sachant à quoi, correspond Tmp(0), ...
    Et raison de plus si le séparateur décimal n'est pas toujours le même : quand Tmp(12) contient un point, tu sais que le réel est complet et que Tmp(13) est le data suivant.

    Bon amusment,

  14. #14
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 573
    Par défaut
    Bonjour,
    Les guillemets permettent de faire le distigo ! Ici les numérique,sans doute au format français, ont été exportés en texte. Si ils avaient été considéré comme numérique le séparateur de décimal serait le point.

    Gère ton fichier en SQL et tu n'auras plus à te soucier de ça ! Phil connait très certainement la méthodologie.

  15. #15
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bien sûr Thumb down ...

    Mais quand on me parle de CSV, SQL n'est pas ma piste privilégiée.
    S'il s'agit de traiter des chaînes contenant des datas ci et là, je partirais plus vite les expressions régulières.
    Mais puisque Split dégrossit déjà tellement le travail, je ne vais pas m'emberlificoter dans la syntaxe complexe des expressions régulières.

    Ta note à propos des guillemets est intéressante et peut-être que Thovan ne devrait pas commencer par leur suppression.


  16. #16
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    Salut

    J'insiste, si j'ai bien compris le chiffre à virgule ou non est toujours entouré de guillemets, donc
    Code vbscript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Dim CSV, CtnLg, CtnCol,Cpt
    CSV = "2020-11-02_151024_3,203031025910,B03,14,Patient,5000,10000,5,5,,,,""32,98874"",NEGATIVE,NEGATIVE,NEGATIVE,NEGATIVE,39,39,39,22,INVALID,NA,RETEST" & vbnewline
    CSV =  CSV & "2020-11-02_151024_3,203031025910""12,3456"",B03,14,Patient,5000,10000,5,5,,,,,NEGATIVE,NEGATIVE,NEGATIVE,NEGATIVE,39,39,39,22,INVALID,NA,RETEST" & vbnewline
    CSV =  CSV & "2020-11-02_151024_3,203031025910,B03,14,Patient,5000,10000,5,5,,,,,NEGATIVE,NEGATIVE,NEGATIVE,NEGATIVE,39,39,39,22,INVALID,""78,91011"",NA,RETEST"
     
     
    CtnLg = split(CSV,vbnewline) 'decoupe du fichier en autant de ligne
     
    For Cpt = 0 To Ubound(CtnLg)
            CtnCol = split(CtnLg(Cpt),chr(34))
            CtnCol(1)=replace(CtnCol(1),",",".")'force avec un . la récupération
            'ou
            'CtnCol(1)=replace(CtnCol(1),".",",")'force avec une , la récupération
            MsgBox  CtnCol(1)
    Next
    OUI en vbScript car je n'ai pas vb.net installé sur cet ordinateur, mais le principe est le même.
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  17. #17
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 573
    Par défaut
    voila
    Pas de Split, pas de recherche des guillemets ou de la virgule !
    C:\Test\Test.Csv
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Imports System.Data.OleDb
    Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim DTReadCSV = New DataTable
            Dim connection As System.Data.OleDb.OleDbConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test;Extended Properties=""text;HDR=Yes;FMT=Delimited""") 'OU HDR=no
            Dim adapter As New OleDb.OleDbDataAdapter("SELECT * FROM [TEST#CSV]", connection)
            adapter.Fill(DTReadCSV)
            Me.DataGridView1.DataSource = DTReadCSV
     
     
     
     
        End Sub
    End Class

  18. #18
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Quitte à dire une connerie, s'il ne s'agit pas ici d'un TD quelconque...

    Utilise le NuGet "CsvHelper".

    Tu vas voir, ça va être bien plus simple d'un coup

    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    using (TextReader tr = File.OpenText("monfichier.csv"))
    {
        CsvConfiguration configuration = new CsvConfiguration(CultureInfo.CurrentCulture);
        CsvReader reader = new CsvReader(tr, configuration);
        reader.Configuration.Delimiter = ",";
        reader.Configuration.Quote = "\"";
        while (reader.Read())
        {
            // Imprime la douzième colonne, logiquement ton nombre à virgule si je compte bien)
            console.write(reader.GetFieldOrDefault(12, string.Empty));
        }
    }

  19. #19
    Membre expérimenté
    Homme Profil pro
    IT Manager
    Inscrit en
    Janvier 2018
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Manager
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2018
    Messages : 220
    Par défaut
    Merci,
    ça à l'air pas mal comme truc .

    Je mets en résolu et je testerai à mon aise parce que ça demande une grosse réécriture du code.
    En attendant, j'ai pu trouver un moyen d'export direct dans un format lisible.

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

Discussions similaires

  1. utilisation sort, split, foreach besoins d'aide
    Par jameson dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 14/04/2009, 09h02
  2. Utilisation de split()
    Par lollipop69 dans le forum VB.NET
    Réponses: 3
    Dernier message: 17/02/2009, 00h57
  3. Conserver le motif utiliser dans split()?
    Par VinnieMc dans le forum Langage
    Réponses: 9
    Dernier message: 15/05/2007, 11h59
  4. probleme utilisation fonction split
    Par Lnmex dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 04/07/2006, 16h40
  5. [langage] utilisation de 'split'
    Par mimilou dans le forum Langage
    Réponses: 9
    Dernier message: 24/02/2004, 13h28

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