Probleme index tableau

Résolu
DariusCosmo Messages postés 8 Date d'inscription lundi 21 avril 2003 Statut Membre Dernière intervention 18 juillet 2011 - 17 juil. 2011 à 19:16
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 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

19 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 juil. 2011 à 08:17
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
3
Utilisateur anonyme
17 juil. 2011 à 19:26
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 juil. 2011 à 20:14
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 juil. 2011 à 20:19
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
DariusCosmo Messages postés 8 Date d'inscription lundi 21 avril 2003 Statut Membre Dernière intervention 18 juillet 2011
17 juil. 2011 à 20:39
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
0
Utilisateur anonyme
17 juil. 2011 à 20:55
Comme dit ucfoutu, il doit nous manquer des informations.
Ce serait bien que tu colle le code complet.
0
DariusCosmo Messages postés 8 Date d'inscription lundi 21 avril 2003 Statut Membre Dernière intervention 18 juillet 2011
17 juil. 2011 à 21:11
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")
0
DariusCosmo Messages postés 8 Date d'inscription lundi 21 avril 2003 Statut Membre Dernière intervention 18 juillet 2011
17 juil. 2011 à 21:15
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

0
Utilisateur anonyme
17 juil. 2011 à 21:30
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.
0
DariusCosmo Messages postés 8 Date d'inscription lundi 21 avril 2003 Statut Membre Dernière intervention 18 juillet 2011
17 juil. 2011 à 21:42
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 juil. 2011 à 21:44
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 juil. 2011 à 21:53
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 juil. 2011 à 22:10
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
0
DariusCosmo Messages postés 8 Date d'inscription lundi 21 avril 2003 Statut Membre Dernière intervention 18 juillet 2011
17 juil. 2011 à 22:20
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))
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 juil. 2011 à 22:58
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
0
DariusCosmo Messages postés 8 Date d'inscription lundi 21 avril 2003 Statut Membre Dernière intervention 18 juillet 2011
18 juil. 2011 à 09:36
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 juil. 2011 à 10:14
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
0
DariusCosmo Messages postés 8 Date d'inscription lundi 21 avril 2003 Statut Membre Dernière intervention 18 juillet 2011
18 juil. 2011 à 10:38
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!
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 juil. 2011 à 10:39
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
0
Rejoignez-nous