Probleme index tableau [Résolu]

DariusCosmo 8 Messages postés lundi 21 avril 2003Date d'inscription 18 juillet 2011 Dernière intervention - 17 juil. 2011 à 19:16 - Dernière réponse : ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention
- 18 juil. 2011 à 10:39
Bonjour a tous,

J'ai un petit problème qui commence a me rendre fou^^, je m'en remet donc à vous en espérant que vous arriverez à m'aider.
alors voila, je dois coder un petit programme capable de modifier automatiquement un fichier texte, celui est former de ligne constituer sous cette forme

"aaaa|bbbb|cccc|dddd|"

il m'est demandé de modifier automatiquement "aaaa" par "1111" et "cccc" par "2222" (par exemple)

je récupère donc ma ligne dans une variable et j’enlève les "|" et stock le tout dans un tableau

dim tableau() as string
dim ligne as string
ligne = monStreamReader.ReadLine()
tableau = Split(ligne, "|")


ensuite je remplace ce que je dois modifier ("aaaa" par "1111")

  If tableau(0) = "aaaa" Then
      tableau(0) = Replace(tableau(0), "aaaa", "1111")
 End If


Pour la 1ere modification tout marche niquel, j'en rajoute donc une 2eme ("cccc" par "2222")

  If tableau(2) = "cccc" Then
      tableau(2) = Replace(tableau(1), "cccc", "2222")
 End If


je teste le tout et maintenant j'obtiens une erreur sur la ligne :
tableau(1) = Replace(tableau(1), "cccc", "2222") 
"L'index se trouve en dehors des limites du tableau."

Pourtant mon tableau est bien plus grand qu'un index de 2 ( en réalité l'index total est de 18)
si quelqu'un pouvez m'aider j'en serais vraiment reconnaissant.

merci d'avance
Afficher la suite 

Votre réponse

19 réponses

Meilleure réponse
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 18 juil. 2011 à 08:17
3
Merci
De bon matin :
Tu ne serais pas tombé dans un tel piège si, comme te l'avais suggéré plus haut banana32, tu avais :
1) testé la longueur de chaque array résultant du Split
2) utilisé une expression conditionnelle pour traiter ou non la ligne résultant en un array non acceptable
Attention toutefois à ta manière de traiter dans un tel cas car :
----- si tu te contentes de "sauter" alors tes replace, mais en réécrivant malgré tout la ligne telle qu'elle est (et qu'il s'agissait de la dernière ligne, blanche comme suspecté) ===>> le résultat sera un fichier comportant 2 lignes blanches en fin de fichier, puis 3 au prochain traitement éventuel, puis 4 au traitement suivant, etc ...

Il te faut donc mettre en oeuvre une réécriture telle que le writeline de la dernière "vraie" ligne se fasse sans saut de ligne.

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP

Merci ucfoutu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de ucfoutu
Utilisateur anonyme - 17 juil. 2011 à 19:26
0
Merci
Salut,
Utilise plutôt les listes typées c'est plus facile :
Dim tableau As New List(Of String)
Dim ligne As String = "aaaa|bbbb|cccc|dddd"
'remplissage du tableau
tableau.AddRange(ligne.Split("|"c))
'remplacement
tableau.Item(tableau.IndexOf("aaaa")) = "1111"

Bonne soirée.
Commenter la réponse de Utilisateur anonyme
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 17 juil. 2011 à 20:14
0
Merci
Bonjour,

et aussi : (ton code)
If tableau(0) = "aaaa" Then
      tableau(0) = Replace(tableau(0), "aaaa", "1111")
 End If

est tel que l'utilisation de la fonction Replace est inutile pour un tel résultat , que l'on obtriendrait à l'identique par :
If tableau(0) = "aaaa" Then
      tableau(0) = "1111"
 End If

A moins que tes explications du problème soient incomplètes !
____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 17 juil. 2011 à 20:19
0
Merci
Un autre point : es-tu certain de développer sous VB.Net (ton utilisation de la fonction Split ...) et non sous VB6 ou VBA ?

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
Commenter la réponse de ucfoutu
DariusCosmo 8 Messages postés lundi 21 avril 2003Date d'inscription 18 juillet 2011 Dernière intervention - 17 juil. 2011 à 20:39
0
Merci
effectivement je n'est pas besoin de la fonction replace, j'ai donc maintenant :

If tableau(0) = "aaaa" Then
      tableau(0) = "1111"
 End If


If tableau(2) = "cccc" Then
      tableau(2) = "2222"
 End If



l'erreur est toujours la meme et ce trouve toujours a peu près au même endroit : "If tableau(2) = "cccc" Then".

Je développe bien en VB.net, seulement j'ai appris avec VB6 donc il ce peut que mon code ne soit pas bien adapter
Commenter la réponse de DariusCosmo
Utilisateur anonyme - 17 juil. 2011 à 20:55
0
Merci
Comme dit ucfoutu, il doit nous manquer des informations.
Ce serait bien que tu colle le code complet.
Commenter la réponse de Utilisateur anonyme
DariusCosmo 8 Messages postés lundi 21 avril 2003Date d'inscription 18 juillet 2011 Dernière intervention - 17 juil. 2011 à 21:11
0
Merci
Pour que vous puissiez mieux comprendre, je vous donne la 1ere des nombreuses lignes de mon fichier texte que je dois modifier :

PA|31052011| 1| 1| 31|641100| 0| 0|SALAIRES | | | 1| |1| | | | |


je dois donc remplacer "PA" ds la 1ere colonne par "JP" et si dans la colonne 6 il y'a 437720 je dois le remplacer par 647000

 Do

            ligne = monStreamReader.ReadLine()


            'la ligne est stockée dans un tableau et on enleve les "|"
            tableau = Split(ligne, "|")
            
            

            'on effectue les modifs
            If tableau(0) = "PA" Then
                tableau(0) = "JP"
            End If

            If tableau(5) = "437720" Then
                tableau(5) = "647000"
            End If



            'calcul du nombre de colonnes ds le tableau
            nbtab = UBound(ligneTab) - LBound(ligneTab) + 1

            'rajout des "|" dans chaque colonne 
            cpt1 = 0
            Do While cpt1 < nbtab
                ligneTab(cpt1) = ligneTab(cpt1) & "|"
                cpt1 = cpt1 + 1

            Loop



            ' on renvoi la ligne complete dans une chaine
            cpt2 = 0
            Do While cpt2 < nbtab
                ligne2 = ligne2 & ligneTab(cpt2)
                cpt2 = cpt2 + 1
                LigneComplete = LigneComplete & ligne2
                ligne2 = ""


            Loop




            'on ecrit dans le fichier de sortie
            monStreamWriter.WriteLine(LigneComplete)
           LigneComplete = ""




        Loop Until ligne Is Nothing





        MsgBox("finni")
Commenter la réponse de DariusCosmo
DariusCosmo 8 Messages postés lundi 21 avril 2003Date d'inscription 18 juillet 2011 Dernière intervention - 17 juil. 2011 à 21:15
0
Merci
petite erreur de variable, dans la derniere boucle remplacer ligneTab(cpt2) par tableau(cpt2) ce qui donne



 Do While cpt2 < nbtab
                ligne2 = ligne2 & tableau(cpt2)
                cpt2 = cpt2 + 1
                LigneComplete = LigneComplete & ligne2
                ligne2 = ""


            Loop

Commenter la réponse de DariusCosmo
Utilisateur anonyme - 17 juil. 2011 à 21:30
0
Merci
Chaque ligne de ton fichier contient-elle le même nombre de séparateurs | ?
Si ton reader lit une ligne vide ou si ta ligne ne contient pas un nombre de séparateur suffisant, une exception sera levée lorsque tu tentera de lire un index inexistant. Pense à tester la longueur de ton tableau.
Commenter la réponse de Utilisateur anonyme
DariusCosmo 8 Messages postés lundi 21 avril 2003Date d'inscription 18 juillet 2011 Dernière intervention - 17 juil. 2011 à 21:42
0
Merci
chaque ligne contient bien le même nombre de séparateur, mon tableau contient 18 index.
quand je ne fait que la 1ere modif (PA->JP) tout va bien mais c'est des que je rajoute la 2eme que l'erreur apparait, pourtant tableau(5) existe bel et bien.

merci enormement de vous penchez sur mon probleme
Commenter la réponse de DariusCosmo
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 17 juil. 2011 à 21:44
0
Merci
Et pendant qu'on y est ===>>
'rajout des "|" dans chaque colonne 
            cpt1 = 0
            Do While cpt1 < nbtab
                ligneTab(cpt1) = ligneTab(cpt1) & "|"
                cpt1 = cpt1 + 1

            Loop

devrait être avantageusement remplacé par une simple utilisation, de la fonction Join.
____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 17 juil. 2011 à 21:53
0
Merci
et puis :
je ne connais rien à VB.net, mais j'ai bien l'impression qu'il "écrase" son fichier par une seule ligne, dès le traitement de la première.
Tu peux y jeter un oeil, banana32 ?


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 17 juil. 2011 à 22:10
0
Merci
Ah non ! Je vois qu'il lit par un StreanReader, mais écrit dans un StreamWriter. Je retire donc ma dernière remarque.


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
Commenter la réponse de ucfoutu
DariusCosmo 8 Messages postés lundi 21 avril 2003Date d'inscription 18 juillet 2011 Dernière intervention - 17 juil. 2011 à 22:20
0
Merci
avec seulement la 1ere modification mon fichier de sortie est nickel, j'ai toute mes lignes bien disposé, mes PA à la place de JP, il n'ecrase pas en une seule ligne.

j'ai aussi tester la presence de tableau(5) avant de faire mes modifs en l'affichant dans un msgbox :
            'la ligne est stockée dans un tableau et on enleve les "|"
            tableau = Split(ligne, "|")
            
            msgbox(tableau(5))

            'on effectue les modifs
            If tableau(0) = "PA" Then
                tableau(0) = "JP"
            End If

            If tableau(5) = "437720" Then
                tableau(5) = "647000"
            End If



il m'affiche la valeur normalement de tableau(5) dans mon msgbox, et ce pour toute les lignes du fichier texte, mais apres l'erreur est généné sur la ligne msgbox(tableau(5))
Commenter la réponse de DariusCosmo
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 17 juil. 2011 à 22:58
0
Merci
Ben voilà !
C'est la dernière ligne de ton fichier qui est vide !
C'est par exemple le cas lorsqu'un fichier a été rempli à l'aide de l'instruction Print de VB6 sans la faire suivre d'un ; pour l'écriture de l dernière ligne.
Ouvre ton fichier texte avec le bloc-notes et appuies sur CTRL+FIN pour voir où tu arrives.


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
Commenter la réponse de ucfoutu
DariusCosmo 8 Messages postés lundi 21 avril 2003Date d'inscription 18 juillet 2011 Dernière intervention - 18 juil. 2011 à 09:36
0
Merci
Effectivement la dernière ligne de mon fichier de sortie est blanche^^
si je comprend bien, je ne dois pas faire une boucle qui lira les lignes jusqu'a la fin ( Loop Until ligne Is Nothing) mais jusqu'a la derniere ligne pleine? corrige moi si je me trompe
Commenter la réponse de DariusCosmo
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 18 juil. 2011 à 10:14
0
Merci
Cela marchera dans ton cas présent, mais je n'aime pas !
Il est dommage que ton fichier ait été ainsi écrit (erreur à éviter).

Geste 1 : nettoyer ton fichier (par bloc-notes ou par code) en enlevant tous les sauts-deligne qui pourraient se trouver à sa fin.
Geste n° 2 : ne jamais écrire ou réécrire un fichier texte dont le dernier caractère serait un saut de ligne.

Voilà.

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
Commenter la réponse de ucfoutu
DariusCosmo 8 Messages postés lundi 21 avril 2003Date d'inscription 18 juillet 2011 Dernière intervention - 18 juil. 2011 à 10:38
0
Merci
J'ai tester la longueur du tableau pour chaque lignes et je fait en sorte de ne pas faire de saut de ligne pour la dernière avec la fonction write() et non writeline(). Tout marche nickel maintenant!

Je vous remercie pour votre aide!
Commenter la réponse de DariusCosmo
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 18 juil. 2011 à 10:39
0
Merci
Maintenant :
- je ne suis pas un VB.nettiste (toi oui), mais un VBiste en, VB6
- voici la fonction que j'écrirais en VB6 pour supprimer d'une chaine ses sauts de lignes qui la terminent éventuellement :
Private Function supp_sauts_de_fin(ByVal chaine As String) As String
  supp_sauts_de_fin = chaine
  Do While Right(supp_sauts_de_fin, 2) = vbCrLf
  supp_sauts_de_fin = Left(supp_sauts_de_fin, Len(supp_sauts_de_fin) - 2)
  Loop
End Function

La transposition en VB.Net devrait être un jeu d'enfant.
- que doit être ce que contient le paramètre chaîne ? ===>> la totalité de ce que contient ton fichier texte.
Voilà.



____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
Commenter la réponse de ucfoutu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.