mikes32
Messages postés11Date d'inscriptionlundi 20 décembre 2010StatutMembreDernière intervention28 décembre 2010
-
24 déc. 2010 à 16:50
cs_ShayW
Messages postés3253Date d'inscriptionjeudi 26 novembre 2009StatutMembreDernière intervention 3 décembre 2019
-
28 déc. 2010 à 21:40
Bonjour à tous !
Je me présente, je m'appelle Mickaël et je suis étudiant en école d'ingénieurs. Je voudrais faire un code qui me permettrait d'extraire et de ranger suivant les caractères à partir d'une chaîne principale qui change:
En fonction d'une chaîne de caractère donnée par exemple: chaine1()= G1 X52.8 Y68
Z95
G1 X48 Y96
Z95
En supposant que chaine1() est un tableau de K-lignes.
Je voudrais extraire les fonctions G, X, Y, et Z dans 4 tableaux différents tout en conservant l'ordre.
En effet, je voudrai exploiter ce rangement pour "dessiner" un chemin d'outil.
Je pensais procéder ainsi, mais cela ne fonctionne pas du tout:
Dim chaine1(),chaine2,fonctionG(),fonctionX(),fonctionY(),fonctionZ() as string
For i=1 to k
chaine2=chaine(i).Split(" ")
If chaine2="G..." then
fonctionG()=chaine2
End If
If chaine2="X..." then
fonctionX()=chaine2
End if
If chaine2="Y..." then
fonctionY()=chaine2
End if
If chaine2="Z..." then
fonctionZ()=chaine2
End if
Next i
J'ai donc plusieurs problèmes, le premier étant que je n'arrive pas à exploiter la fonction Split...et je ne comprends pas pourquoi. Ensuite, je pensais utiliser les expressions régulières pour les conditions If mais je doute que celle que j'ai écrite soit bonne: "[G][0-99]"...
En espérant avoir un éclairage sur la fonction Split et sur les métacaractères ...
Salut Mickaêl
colles ce code pour ton bouton
Cela fonctionne
L'erreur vient de la fin du fichier .Txt qui contenait un espace. Et comme le séparateur est justement un espace le programme attendait après ce dernier espace des données iso pour former la dernière ligne. Et comme il n'y avait pas de données le programme plantait
Dim chemin As String
Dim line As String
Dim j, c, k As Integer
Dim iso() As String
Dim chaine As String
Dim Fiso() As String
Dim Giso() As String
Dim Miso() As String
Dim Siso() As String
Dim Xiso() As String
Dim Yiso() As String
Dim Ziso() As String
Dim isochaine() As String
Dim delimiter As Char
Dim iter, iter1 As Long
Dim gindex, mindex, findex, sindex, xindex, yindex, zindex As Long
'chemin = "F:\Cours\Birse\SIM Info\Projet\Code.txt"
chemin = "D:\Outil.txt"
Dim stm As New IO.StreamReader(chemin)
k = 0
j = 0
c = 0
'Lecture et Chargement dans un tableau de chaînes
ReDim iso(0)
line = stm.ReadLine()
While line <> Nothing
iso(k) = line
Console.WriteLine(line)
k = k + 1
ReDim Preserve iso(k)
line = stm.ReadLine()
End While
ReDim Preserve iso(k - 1)
'Ecriture du tableau de chaînes et vérification graphique
chaine = ""
For i = 1 To k - 1
chaine = chaine & iso(i) & " "
chaine = chaine & vbCrLf
Next i
MsgBox(chaine)
gindex = 0
mindex = 0
findex = 0
sindex = 0
xindex = 0
yindex = 0
zindex = 0
delimiter = " "
For iter = 0 To iso.Length - 1
isochaine = iso(iter).Split(delimiter)
For iter1 = 0 To isochaine.Length - 1
Select Case isochaine(iter1).Substring(0, 1)
Case "F" : ReDim Preserve Fiso(findex)
Fiso(findex) = isochaine(iter1).Substring(1) + " "
findex = findex + 1
Case "G" : ReDim Preserve Giso(gindex)
Giso(gindex) = isochaine(iter1).Substring(1) + " "
gindex = gindex + 1
Case "M" : ReDim Preserve Miso(mindex)
Miso(mindex) = isochaine(iter1).Substring(1) + " "
mindex = mindex + 1
Case "S" : ReDim Preserve Siso(sindex)
Siso(sindex) = isochaine(iter1).Substring(1) + " "
sindex = sindex + 1
Case "X" : ReDim Preserve Xiso(xindex)
Xiso(xindex) = isochaine(iter1).Substring(1) + " "
xindex = xindex + 1
Case "Y" : ReDim Preserve Yiso(yindex)
Yiso(yindex) = isochaine(iter1).Substring(1) + " "
yindex = yindex + 1
Case "Z" : ReDim Preserve Ziso(zindex)
Ziso(zindex) = isochaine(iter1).Substring(1) + " "
zindex = zindex + 1
End Select
MessageBox.Show("fonction Iso : " & isochaine(iter1))
Next
Next
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
jordane45
Messages postés38144Date d'inscriptionmercredi 22 octobre 2003StatutModérateurDernière intervention21 avril 2024344 24 déc. 2010 à 17:12
Bonjour,
Déjà pour tes IF, ce qui me gène ce sont les caractères utilisés :
If chaine2="G..." then
Les points ne sont pas des "jokers". A la rigueur une astérisque ou un '?' en fonction du langage;...
ensuite, pour indiquer que tu veux savoir si ta chaine commence par G, il faut que utilises une instruction qui regarde Le premier caractère de ta chaine à partir de la gauche. (un truc du genre If LEFT(MaChaine,1)="G" then..
(instruction a trouver en VB2005 car là je te donne ce qu'on utilise en VB6.
Bref.. voila l'idée.
Déjà avec ça tu devrais pouvoir avancer.
Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI
tout sur Split : Découpe en plusieurs sous chaînes une chaîne de départ, cela par rapport à un séparateur.
Exemple :
Je récupère dans un fichier une chaîne de mots ayant pour séparateur « ; », je veux mettre chaque mot dans un tableau.
Chaîne contenant les mots séparés par « ; »
Dim s As String= "Philippe;Jean ;Toto"
Dim separateur As Char = ";"
Dim nom() As String
nom=s.Split(separateur)
Donne :
nom(0)= "Philippe"
nom(1)= "Jean"
nom(2)= "Toto"
Remarque: Quand on déclare le tableau nom(), on ne donne pas le nombre d'élément, c'est Split qui crée autant d'élément qu'il faut.
En Framework 2, on peut utiliser plusieurs séparateurs différents:
nom=s.Split( New Char() {" "c, ","c, "."c }) 'ici on a 3 séparateurs: l'espace, la virgule et le point.
le c après chaque séparateur veut dire Char, car les séparateurs sont des caractères.
On peut ajouter 2 paramètres permettant d'indiquer le nombre de ligne maximum et forcer l'élimination des lignes vides.
Dim sep() As Char={" "c, ","c, "."c}
Dim nom() As String = S.Split ( sep, 100, StringSplitOptions.RemoveEmptyEntries )
Allons encore plus loin: avant et après le séparateur il peut y avoir des espaces:
Il faut dans ce cas utiliser la méthode Split de la classe Regex:
Imports System.Text.RegularExpressions
Dim S As String = "abc ; def ; ghi"
' On crée un Regex
Dim R As New Regex("\s*;\s*")
' décomposition de ligne en champs
Dim Nom As String() = R.Split(S)
2) Le problème des If : Les points ne sont pas des "jokers"
Utilise la classe Substring pour extraire des morceaux de chaine dans une chaine de caractère
.Substring
Extrait une partie d'une chaîne.
Le premier paramètre indique la position de départ; le second, le nombre de caractères à extraire.
Dim a As String= "Informatique"
MessageBox.show(a.Substring(2,3)) 'Affiche for
Le premier paramètre indique la position du caractère où doit commencer la sous-chaîne, en commençant à la position 0. (les caractères sont comptés 0, 1, 2, 3....
Le second paramètre la longueur de la sous-chaîne.
Exercice 1: comment obtenir les 4 caractères de droite:
Dim a As String= "Informatique"
MessageBox.show(a.Substring(A.Length-4)) 'Affiche ique
Ici on omet le second paramètre,la longueur de la sous-chaîne, va jusqu'a la fin de la chaîne.
Exercice 2: comment obtenir les 3 caractères de gauche:
Dim a As String= "Informatique"
MessageBox.show(a.Substring(0, 3)) 'Affiche inf
Colles ce code dans une feuille dans un mini-projet et tu comprendras comment faire
Pour voir les variables exécutes le en pas à pas
Dim fonctionG, fonctionX, fonctionY, fonctionZ As String
Dim i As Integer
Dim chaine As String = "G1 X52.8 Y68 Z95"
Dim separateur As Char = " "
Dim souschaine() As String
souschaine = chaine.Split(separateur)
For i = 0 To souschaine.Length
Select Case souschaine(i).Substring(0, 1)
Case "G"
fonctionG = souschaine(i)
Case "X"
fonctionX = souschaine(i)
Case "Y"
fonctionY = souschaine(i)
Case "Z"
fonctionZ = souschaine(i)
End Select
Next i
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
GRENIER Alain
Vous n’avez pas trouvé la réponse que vous recherchez ?
mikes32
Messages postés11Date d'inscriptionlundi 20 décembre 2010StatutMembreDernière intervention28 décembre 2010 25 déc. 2010 à 20:24
Merci beaucoup pour ces explications. J'ai rédigé mon programme comme-ceci, mais lorsque je le lance, il me dit que l'index se trouve en dehors des lignes du tableau(à la ligne mis en évidence par ). Je ne comprends pas pourquoi ...
Dim separ() As String
Dim fonctionGiso(), fonctionMiso(), fonctionXiso(), fonctionYiso(), fonctionZiso() As String
For i = 1 To k
separ = iso(i).Split(" ")
Next i
For i = 0 To separ.Length
Select Case separ(i).Substring(0, Len(separ(i)))
Case "G"
fonctionGiso(i) = separ(i)
Case "X"
fonctionMiso(i) = separ(i)
Case "Y"
fonctionXiso(i) = separ(i)
Case "Z"
fonctionZiso(i) = separ(i)
End Select
Next i
MsgBox(fonctionXiso(1))
Si je comprends bien tu as un tableau nommé iso qui contient des chaines de la forme "G1 X52.8 Y68 Z95"
Iso est le tableau des chaines et souschaine est celui des souschaines
1) En VB Net les tableaux commencent avec l'indice 0
donc : For i = 1 to k peut poser problème. De plus quelle est la valeur de k ?
2) Ta boucle For i = 1 to k
Tu ne traites que le dernier élément du tableau iso dans la seconde boucle : separ contient le tableau de iso(k) et tous les précédents iso sont passés à la trappe
3) Select Case separ(i).Substring(0, Len(separ(i)))
Pour avoir le premier caractère c'est : Select Case separ(i).Substring(0, 1)
De plus le mot clé Len est du VB 6 et non pas du VB Net
4) Msgbox est du VB 6.0. En VB Net on utilise MessageBox.Show
On suppose le tableau iso déjà créé
Testes ce code
Messagebox.Show affiche au fur et à mesure les différentes fonctions
Dim fonctionG, fonctionX, fonctionY, fonctionZ As String ' les 4 fonctions
Dim i As Integer , j as integer ' pour les 2 boucles
Dim separateur As Char = " " ' le séparateur
Dim souschaine() As String ' le tableau des sous-chaines
For i = 0 To iso.length ' on parcourt le tableau iso
souschaine = iso(i).Split(" ") ' on crée le tableau souschaine
For j = 0 To souschaine.Length ' pour chaque souschaine
Select Case souschaine(j).Substring(0, 1) ' 1° caractère de souschaine
Case "G"
fonctionG = souschaine(j)
Case "X"
fonctionX = souschaine(j)
Case "Y"
fonctionY = souschaine(j)
Case "Z"
fonctionZ = souschaine(j)
End Select
MessageBox.Show ("Fonction : " & souschaine(j)) ' affichage
Next j
Next i
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
Mickaël utilise des tableaux pour ses fonctions
Moi en exemple je n'ai pas utiliser des tableaux de chaines mais uniquement des chaines de caractères
C'est facile à adapter
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
mikes32
Messages postés11Date d'inscriptionlundi 20 décembre 2010StatutMembreDernière intervention28 décembre 2010 27 déc. 2010 à 19:15
Merci pour votre aide !
Mais j'ai toujours un problème qui subsiste:
souschaine = iso(i).Split(" ") ' on crée le tableau souschaine
Visual Studio me donne le message suivant: La référence d'objet n'est pas définie à une instance d'un objet.
Je ne comprends pas, pourtant, j'ai bien chargé le tableau iso() de chaînes de caractères...et en le vérifiant, j'ai toujours le même message d'erreur !
Rajoutes dans les déclarations : Dim separateur As Char = " " ' le séparateur
Modifie ta ligne ainsi : souschaine = iso(i).Split(separateur) ' on crée le tableau souschaine
Le séparateur doit être de type Char et non de type String
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
mikes32
Messages postés11Date d'inscriptionlundi 20 décembre 2010StatutMembreDernière intervention28 décembre 2010 27 déc. 2010 à 20:40
Oui, voilà mon code:
Dim fonctionGiso, fonctionX, fonctionY, fonctionZ As String ' les 4 fonctions
'Dim i As Integer, j As Integer ' pour les 2 boucles
Dim separateur As Char = " " ' le séparateur
Dim souschaine() As String ' le tableau des sous-chaines
For i = 1 To iso.Length ' on parcourt le tableau iso
souschaine = iso(i).Split(separateur) ' on crée le tableau souschaine
For j = 0 To souschaine.Length ' pour chaque souschaine
Select Case souschaine(j).Substring(0, 1) ' 1° caractère de souschaine
Case "G"
fonctionGiso = souschaine(j)
Case "X"
fonctionX = souschaine(j)
Case "Y"
fonctionY = souschaine(j)
Case "Z"
fonctionZ = souschaine(j)
End Select
MessageBox.Show("Fonction : " & souschaine(j)) ' affichage
Next j
Next i
J'ai bien une boucle correcte qui se fait(j'obtiens bien la Messagebox avec "M08", mais à la seconde, à la ligne Select Case souschaine(j).Substring(0, 1), il me dit que l'index se trouve en dehors du tableau... Je ne comprends pas comment celui ci peut être en dehors.
Je rappel, ma fonction iso() contient ce genre de caractères: M08
G1 X28 Y27
mikes32
Messages postés11Date d'inscriptionlundi 20 décembre 2010StatutMembreDernière intervention28 décembre 2010 27 déc. 2010 à 20:48
Ah oui, pour le For i=1 to iso.length, j'ai mis la valeur de départ de i=1 car iso() n'est pas défini pour la valeur 0. Donc cela ne fonctionne pas sinon. Par contre, la seconde erreur avec l'index en dehors du tableau je ne comprends toujours pas ...
Salut Mickaël
J'ai testé ce code et il fonctionne correctement chez moi
Dim iso() As String
Dim fonctionGiso(), fonctionXiso(), fonctionYiso(), fonctionZiso() As String ' les 4 fonctions
Dim i As Integer, j As Integer ' pour les 2 boucles
Dim separateur As Char = " " ' le séparateur
Dim souschaine() As String ' le tableau des sous-chaines
ReDim iso(0 To 3) ' pour 4 chaines
ReDim fonctionGiso(0 To 3)
ReDim fonctionXiso(0 To 3)
ReDim fonctionYiso(0 To 3)
ReDim fonctionZiso(0 To 3)
iso(0) = "G1 X52.8 Y68 Z95"
iso(1) = "G4 X75.8 Y72 Z54"
iso(2) = "G6 X89.8 Y79 Z78"
iso(3) = "G9 X95.8 Y81 Z95"
For i = 0 To iso.Length - 1 ' on parcourt le tableau iso
souschaine = iso(i).Split(separateur) ' on crée le tableau souschaine
For j = 0 To souschaine.Length - 1 ' pour chaque souschaine
Select Case souschaine(j).Substring(0, 1) ' 1° caractère de souschaine
Case "G"
fonctionGiso(i) = souschaine(j)
Case "X"
fonctionXiso(i) = souschaine(j)
Case "Y"
fonctionYiso(i) = souschaine(j)
Case "Z"
fonctionZiso(i) = souschaine(j)
End Select
MessageBox.Show("Fonction : " & souschaine(j)) ' affichage
Next j
Next i
- autre chose en VB Net les tableaux commencent à l'indice 0. Dans l'exemple les tableaux ont 4 éléments indicés de 0 à 3
- autre chose les chaines iso() sont-elles toujours avec les mêmes lettres et dans le même ordre et toujours par groupe de 4( ici G X Y et Z) ?
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
mikes32
Messages postés11Date d'inscriptionlundi 20 décembre 2010StatutMembreDernière intervention28 décembre 2010 27 déc. 2010 à 21:30
Le programme à l'air de fonctionné...
sauf qu'à la ligne Case "G",si il ne trouve pas de fonctions G, cela ne fonctionne pas. J'aurai voulu mettre une condition avec un If, c'est à dire, si le premier caractère de la chaîne est un G, on met la chaîne dans fonctionGiso(), si c'est un M, et ainsi de suite...
Comment je pourrais faire ?
- Et malheureusement non, les chaînes iso() ne sont pas toujours identiques, puisqu'en fait ces chaînes représentent le code ISO (code que l'on donne à une machine à commande numérique) pour lui permettre d'usiner une pièce.
Voilà un exemple (très court et très simplifié), juste pour donner une idée de programme iso:
%2 (nom du programme)
G0 X24 Y24
Z68
S2156
M8
G1 X24 Y23 F100
Z66
G1 X24 Y0
Z66
M02
Dans ton exemple ce qui t'intéresses c'est de savoir combien il y a de commandes G et leurs valeurs qui vont avec ( faire la même chose pour toutes les lettres de commandes iso qui apparaissent dans une ligne ou dans tout le programme)
Dans ton exemple dans la première ligne il y a un G, un X et un Y
Dans tout le programme il y a 3 G, 3 X, 3 Y, 3 Z, 1 S, 2 M et 1 F
Est le résultat d'une ligne ou d'un programme complet qui t'intéresse ?
Autre chose : les lettres qui peuvent apparaitre vont-elles de A à Z ?
Comment doit être présenté le résultat à l'écran ?
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
mikes32
Messages postés11Date d'inscriptionlundi 20 décembre 2010StatutMembreDernière intervention28 décembre 2010 28 déc. 2010 à 12:16
C'est le programme complet qui m'intéresse.
Les seuls lettres possibles sont: G,M,S,F,X,Y,Z
En fait, G1 X24 Y24 Z22 F100, donne comme ordre à la machine à commande numérique de se déplacer à vitesse travail=100 mm/min au point de coordonnées (24,24,22). C'est pourquoi je suis intéressé de récupérer toutes les chaînes de caractères puisque mon programme est un programme de test de ces programmes "ordres".
Je dois par exemple vérifier que lors d'un déplacement rapide, l'outil n'entre pas en collision avec le brut.
C'est pourquoi, je voudrai absolument tout mettre dans 7 tableaux pour les lettres G, M,S,F,X,Y,Z et dans l'ordre de la chaîne d'origine.De plus, si on reprends l'exemple précédent de programme:
La 1er ligne contient un G, je veux ranger G0 dans le tableau G, 24 dans le tableau X,24 dans le tableau Y et 68 dans le tableau Z.
La 3 ligne contient M8, je veux ranger 8 dans le tableau M.
La 4 ligne contient G, je veux ranger G1 dans le tableau G, 24 dans le tableau X ...
Et ainsi de suite.