Ubound (array) limité ?

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Benso
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mar. 06 déc. 2016 11:57
Status : Hors ligne

Ubound (array) limité ?

#1

Message par Benso »

Bonjour à tous ,

J'ai un soucis concernant des arrays
For $i = 1 To UBound($aArrayRUEBIS) - 1
         if $menu3 =($aArrayRUEBIS[$i])[3] Then
         ConsoleWrite("Rentre dans la boucle  : "  &@CRLF)
         $menu1 = ($aArrayRUEBIS[$i])[0]
         ConsoleWrite("GROUPE  : " &$menu1 &@CRLF)
         Else
         ConsoleWrite("Else  : " &$i &@CRLF)
   EndIf
   Next
Voici l'array qui pose soucis : $aArrayRUEBIS , c'est un array qui parcout un fichier texte qui se présente sous cette forme :
Groupe   Secteur  Commune  Adresse
34 2  PARIS 1,-2,-3,-4,-5,-6,-7,-8,-9,-10-RUE-ROUGET-DE-LISLE
47 2  PONTARLIER  2,-4,-6,-8,-10,-12-RUE-VICTOR-SCHOELCHER
38 3  AUDINCOURT  1,-2,-3,-4,-5,-6,-7,-8-RUE-GEORGES-CUVIER
....( j'ai plus de 600 lignes , le séparateur entre chaque info est la tabulation )
Quand mon code s'exécute il s'arrête à $i = 369 ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
if $menu3 =($aArrayRUEBIS[$i])[3] Then
if $menu3 =($aArrayRUEBIS[$i]^ ERROR

Du coup pour tester j'ai réduit mon fichier txt a seulement une 40 de lignes et la je n'ai plus l'erreur.
Je ne pense pas que ca soit la ligne 369 puisqu'elle possède la meme syntaxe que les autres.

De plus j'utilise $aArrayRUEBIS dans une autre fonction mais avec ($aArrayRUEBIS[$i])[2] sans aucun soucis, mais quand je veux travailler avec les adresses [3] ( qui ne sont finalement qu'une chaine de caractère) j'ai un problème.

Auriez vous une solution a m'apporter ou une direction vers laquelle m'orienter?

Merci d'avance.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Ubound (array) limité ?  

#2

Message par mikell »

La première chose que je ferais, c'est juste après la création de l'array vérifier avec un _ArrayDisplay ce qui se passe à la ligne 369
Tu pourrais aussi nous poster ton fichier txt
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: Ubound (array) limité ?

#3

Message par jguinch »

Et si tu vires les parenthèses ?
($aArrayRUEBIS[$i])[3] => $aArrayRUEBIS[$i][3]

A moins que l'élément $i contienne un tableau....
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
Benso
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mar. 06 déc. 2016 11:57
Status : Hors ligne

Re: Ubound (array) limité ?

#4

Message par Benso »

Merci à vous pour vos pistes , j'ai pus trouver la source de mon malheur , et c'est bien la ligne 369 my bad !
Visuellement la ligne semblait correct , mais avec l'option afficher tous les caractères de Notepad ++ j'ai pus apercevoir le subterfuge !
Un double espace à la place d'une tabulation ! Du coup $array[369][3] n'existait pas !
C'est bête et con mais qu'est ce que c'est chiant !

En tout cas merci à vous de m'avoir aiguiller dans la bonne direction.
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: Ubound (array) limité ?

#5

Message par ZDS »

Bonjour Benso,

Même si ton souci est corrigé, tu n'indique pas comment tu récupères les informations au départ (ce qui limitait de base l'aide qu'on pouvait t'apporter ^^) Bref, je t'aurais bien conseillé d'utiliser une méthode à base de RegExp pour récupérer les infos que tu souhaites dans ton tableau, et ainsi éviter tous les problèmes du genre de celui-ci puisque ton tableau aurait été conforme directement (c'est sans doute plus consommateur en terme de ressources, mais c'est tout de même immensément plus puissant).

Avec un pattern spécifique, tu peux utiliser $1...$4 pour récupérer tes 4 infos sur chaque ligne :

Code : Tout sélectionner

Local $pattern = "^(\d+)\s+(\d+)\s+(\S+)\s+(\S+)$"
For $i = 1 To $lines[0]
	Local $line = $lines[0] ; La ligne de ton fichier
	If Not StringRegExp($line, $pattern) Then
		Msgbox(0, "", "La ligne "&$i&" n'est pas conforme")
	Else
		$array[$i][0] = StringRegExpReplace($line, $pattern, "$1") ; Groupe n°1 (\d+) = "Groupe"
		$array[$i][1] = StringRegExpReplace($line, $pattern, "$2") ; Groupe n°2 (\d+) = "Secteur"
		$array[$i][2] = StringRegExpReplace($line, $pattern, "$3") ; Groupe n°3 (\S+) = "Commune"
		$array[$i][3] = StringRegExpReplace($line, $pattern, "$4") ; Groupe n°4 (\S+) = "Adresses"
	EndIf
Next
Ainsi tu t'assures que le double/triple/n-th espace ou la tabulation serviront dans le split de ta ligne. Ma remarque ne te sera peut-être pas utile, mais éventuellement pour les gens ayant un souci similaire :)

A bientôt !

@Mikell: Au contraire, c'est le parsing de l'info sans vérifier son format qui est extrêmement dangereux, et justement la conformité est là dans la regexp. Le pattern que j'ai donné n'est qu'à titre indicatif, et le sous-groupe (\S+) des adresses peut être modifié pour matcher correctement le format prévu, comme (\d\S+) ou encore (\d(?:,-?\d+)\S+). De même pour les splitters, à la place de \s, on peut utiliser (?:\t|\s{2,}) pour prévoir une tabulation ou deux espaces minimum. Ou encore plus respectueux du formalisme demandé : \t tout simplement (Benso disait "j'ai plus de 600 lignes , le séparateur entre chaque info est la tabulation"), et ainsi les lignes non conformes serait directement détectées.
Le mieux (dans le sens "Le plus simple") serait d'utiliser un formalisme que tout le monde connait comme le CSV avec des points-virgule, mais ce n'est pas le cas ici :) Et d'après ce qu'on en voit de l'exemple, ça ne sera de toute manière jamais "SAINT ETIENNE" mais "SAINT-ETIENNE" à moins de mélanger les torchons de "Commune" et les serviettes de "Adresses" ^^
Modifié en dernier par ZDS le ven. 20 janv. 2017 13:46, modifié 5 fois.
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Ubound (array) limité ?

#6

Message par mikell »

Benso a écrit :Un double espace à la place d'une tabulation !
Je l'aurais parié :mrgreen:
Le _ArrayDisplay de vérification/debug est honteusement sous-utilisé :P

@ZDS
Dangereux, à moins d'être absolument sûr que dans le champ "Commune" il n'y aura jamais SAINT ETIENNE
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Répondre