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 :

Message d'erreur lié à la fonction split


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 28
    Points : 14
    Points
    14
    Par défaut Message d'erreur lié à la fonction split
    Bonjour à tous,

    Je souhaite découper une ligne de fichier texte (ici nommée line) contenant 6 valeurs séparées par une tabulation. Après découpage, chaque valeur individuelle est envoyé dans une datarow (nommée row).

    J'ai le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    For i = 0 To 5
         row(i) = line.Split(vbTab)(i)
     Next i
    J'a un message d'erreur me disant que la colonne 3 de ma ligne n'est pas trouvable. Alors que si j'affiche individuellement chaque valeur de ma ligne dans un msgbox, elles y sont toutes.


    Quelqu'un aurait il une idée?

    Par avance,

    Merci

  2. #2
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Ce serait bien de faire un copier/coller du message d'erreur. Parfois, un petit détail peut avoir son importance pour mettre sur la voie car en l'état, si tu es sûr que chaque ligne contient bien au moins 6 éléments, ça devrait fonctionner même si c'est loin d'être top comme code (tu redécoupes ta ligne à chaque fois :-/).

    Essaie plutôt quelque chose de ce genre-ci (fais de tête donc probablement pas correct syntaxiquement comme tel) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim tab As String()
    tab = line.Split(vbTab)
    For i = 0 to 5
        row(i) = tab(i)
    Next i
    Tu peux alors améliorer en remplacer la borne supérieur de la boucle par tab.Count-1 (ou tab.length-1... J'utilise pas les tableaux et je ne sais jamais c'est qu'elle fonction pour avoir leur nombre d'éléments).

    Tu peux aussi te diriger vers une for each où le problème de borne n'a plus lieu d'être mais où tu dois alors mettre en place un compteur toi-même pour mettre la donnée dans la bonne case de la datarow.
    Kropernic

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Tout d'abord , merci pour cette première solution.
    Cependant, cela ne fonction pas.

    Voici le message d'erreur:

    "Une exception non gérée du type 'System.IndexOutOfRangeException' s'est produite dans System.Data.dll
    Informations supplémentaires*: Impossible de trouver la colonne 3."

  4. #4
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    "IndexOutOfRangeException" indique que ton programme essaie d'accéder à une case du tableau qui n'existe pas.

    Traduit littéralement en français, ce mot barbare donnerait "Erreurd'IndiceEnDehorsDesBornes"

    Soit certaines tabulations n'en sont pas (ce qui ne donne pas le nombre d'élément attendu dans le tableau), soit certaines lignes sont plus courtes que tu ne le penses ;-).
    Kropernic

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    J'ai vérifié et toutes les tabulations en sont.

    Les fichiers text sont générés automatiquement de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    line = line & vbTab & Trim(.Item(j))
    Ensuite, les autres lignes ne sont pas plus courtes.

    D'ailleurs,ce que je ne comprend pas c'est la chose suivante.
    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    For i = 0 To 5
       row(i) = line.split(vbtab)(i)
    Next i
    CA NE FONCTIONNE PAS et j'obtiens le message d'erreur précédent.

    En revanche,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    For i = 0 To 5
       msgbox( line.split(vbtab)(i))
    Next i
    CA FONCTIONNE et m'affiche les bonnes valeurs dans une msgbox.


    Pourquoi???

  6. #6
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    l'index "en-dehors des bornes" c'est peut-être pour ton objet row du coup.
    Plus je connais de langages, plus j'aime le C.

  7. #7
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Citation Envoyé par jopopmk Voir le message
    Salut,

    l'index "en-dehors des bornes" c'est peut-être pour ton objet row du coup.
    Exactement ce que j'allais dire.

    Si ça ne vient pas de la ligne, la seule chose qui reste, c'est le datarow.
    Kropernic

  8. #8
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,


    Citation Envoyé par tom_plaquiste Voir le message
    Tout d'abord , merci pour cette première solution.
    Cependant, cela ne fonction pas.

    Voici le message d'erreur:

    "Une exception non gérée du type 'System.IndexOutOfRangeException' s'est produite dans System.Data.dll
    Informations supplémentaires*: Impossible de trouver la colonne 3."
    Moi, je suis plutôt de l'avis de jopopmk et de Kropernic. En toute logique ce qui cloche, c'est ta table ou ta ligne. Split est dans System.String et ton horreur est dans System.Data. Ou bien, tu manques de colonnes, ou bien tu n'as pas le bon nom de colonne.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  9. #9
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2013
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 235
    Points : 359
    Points
    359
    Par défaut
    Bonjour à tous,
    Oui nous sommes tous d'accord...
    Un petit test facile avec une listbox :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Dim Liste As New ListBox
    Me.Controls.Add(Liste)
    For i As Integer = 0 To line.Split(vbTab).GetUpperBound(0)
         'row(i) = (line.Split(vbTab)(i))
         Liste.Items.Add(i.ToString & "-" & line.Split(vbTab)(i))
    Next i
    Bon vous allez me dire qu'avec les msgbox c'est la même chose
    Par nature les mots, ils sont flous, c'est une fois alignés qu'ils se précisent.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Merci de vos réponses.

    La solution avec la listbox marche trés bien en effet.... mais ça fait comme la msgbox.

    Je me suis assuré que chaque ligne qui était "splitée" contenait bien le bon nombre de valeurs avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox(Str(line.Split(vbTab).Length))
    De ce coté là, la fonction marche trés bien. Cela confirme donc bien que le problème vient du row.

    Mais je ne vois vraiment pas à quel niveau.

    Si quelqu'un a une idée je suis preneur

  11. #11
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Pour qu'on puisse t'aider plus avant, va falloir montrer le code où tu déclares ton objet nommé "row".

    Et s'il dépend d'un objet de type DataTable (c'est fort probable à priori), va falloir aussi la définition de cet objet-là vu que les colonnes du DataRow proviendront du DataTable.
    Kropernic

  12. #12
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2013
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 235
    Points : 359
    Points
    359
    Par défaut
    J'ai une vague idée de comment résoudre le problème, mais comme dit Kropernic, sans plus d'infos sur le fameux "row" ça ne sera pas facile de "deviner"...
    Mon idée est celle-ci: (a peu près)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            Dim Valeur(line.Split(vbTab).GetUpperBound(0)) As Object
            For i As Integer = 0 To line.Split(vbTab).GetUpperBound(0)
                Valeur(i) = line.Split(vbTab)(i)
            Next
            row.rows.add(Valeur)
    Par nature les mots, ils sont flous, c'est une fois alignés qu'ils se précisent.

  13. #13
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Merci à tous

    Il s'agissait de la datarow en effet. Elle était attribué à un datatable, effacée par mégarde, dans une instruction quelques lignes plus haut.

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Indépendamment de ce qui est dit plus haut, pourquoi tu fais une boucle?
    Valeur = line.Split(vbTab)

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

Discussions similaires

  1. message d'erreur avec la fonction gtk_status_icon_new_from_file
    Par autre mickael dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 30/06/2011, 13h27
  2. Réponses: 1
    Dernier message: 16/01/2008, 12h07
  3. Problème de message d'erreur sur une fonction SNMP
    Par kriptoo dans le forum Langage
    Réponses: 1
    Dernier message: 18/05/2007, 01h08
  4. Cacher le message d'erreur lié à la fonction ldap_bind
    Par NiGHtyWolf dans le forum Langage
    Réponses: 7
    Dernier message: 15/03/2007, 17h34
  5. Réponses: 2
    Dernier message: 01/06/2006, 14h54

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