Extraire des données textes et les transformers [Résolu/Fermé]

Signaler
-
 eristof23 -
Bonjour
Je voudrait extraire les données X et Y d un fichier texte et les transformer sous la forme A=(X, Y) a l'aide d'une moulinette automatique.

exemple:
MSG("MILLING 300-2")
G0 X0.000 Y47.359
G1 X-88.100 Y62.359
G0 Z0.15
.....

devient ------>

A=(0, 47.359)
B=(-88.100, 62.359)
.....

merci d'avance

4 réponses

Messages postés
16477
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
10 juin 2021
3 189
Bonjour
Données sur une seule colonne ?
combien de lignes environ ?

D'avance merci
les données seront dans une seule colonne et environ 100 lignes

exemple:

G0 X0.000 Y47.359
G0 Z0.15
G1 X0.000 Y47.359
G1 X-88.100 Y47.359
G1 X-88.100 Y62.359
G1 X-124.355 Y124.299
G1 X-123.216 Y249.163
G1 X-85.458 Y254.487
G1 X-65.188 Y266.190
G1 X-32.156 Y276.500 ;WAS 277.152
G1 X-17.904 Y296.471
G1 X-28.400 Y280.210
G1 X-29.900 Y146.729
G1 X-38.180 Y90.002
G1 X-76.127 Y93.094
G1 X-79.159 Y216.384
G0 Z53.5
Messages postés
54112
Date d'inscription
lundi 13 août 2007
Statut
Contributeur
Dernière intervention
21 juin 2021
16 107
Est-ce que les coordonnées ont toujours 3 décimales ?
Pas forcement mais si la solution est plus facile avec toujours le même nombre de décimales j'adapterais les données de base
Messages postés
16477
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
10 juin 2021
3 189
Bonjour,

proposition avec une macro VBA

 Option Explicit
Const Lig_0 As Byte = 2 'A adapter au contexte
Const Col As String = "A" 'A adapter au contexte
'---------
Sub positionner_xy()
Dim Derlig As Byte
Dim Lettres As String, Cellule As Range, Lig As Byte, Lig_f As Byte
Dim Separ, Alpha As Byte, Xxx As String, Yyy As String
Dim test

Application.ScreenUpdating = False
Sheets(2).Columns(Col).Clear
Derlig = Sheets(1).Cells(Lig_0, Col).End(xlDown).Row
Lig_f = Lig_0

For Lig = Lig_0 To Derlig
Set Cellule = Sheets(1).Cells(Lig, Col)
If Cellule Like "*X*" And Cellule Like "*Y*" Then
' lettres de départ
Alpha = Alpha + 1
Lettres = car_col(Alpha)
'recherche coordonnées
Separ = Split(Cellule)
Xxx = Right(Separ(1), Len(Separ(1)) - 1)
Yyy = Right(Separ(2), Len(Separ(2)) - 1)
'concaténation et restitution
Sheets(2).Cells(Lig_f, Col) = Lettres & "= (" & Xxx & ", " & Yyy & ")"
Lig_f = Lig_f + 1
End If
Next
Sheets(2).Activate
End Sub
'------------
Function car_col(num As Byte) As String
Dim serie As Byte
Select Case num
Case Is = 0
car_col = "#########"
Case Is < 27
car_col = Chr(64 + num)
Case Else
serie = Int((num - 26) / 27) + 1
car_col = Chr(64 + serie) & Chr(64 + num - 26 * serie)
End Select
End Function

Maquette:
https://www.cjoint.com/?3DdlmYjvZHg

Michel
merci beaucoup le programme fonctionne en partie mais j'ai quelques problèmes
quand je teste l'exemple suivant il me prend dans la première ligne G64 en compte pour la valeur du X et le programme s'arrête a la lettre L

G0 G64 X424.719 Y25.467 A=DC(270) F9549 S11937 M3 M41 M8 M7 D1 H30=1
G0 Z101.3 M106 M22
G1 G64 X101.922 Y25.467
G1 X19.396 Y0.173
G2 X0 Y14.514 I=AC(15) J=AC(14.514)
G1 X0 Y67.5
G2 X10 Y77.5 I=AC(10) J=AC(67.5)
G1 X335.763 Y77.5
G3 X345.763 Y87.5 I=AC(335.763) J=AC(87.5)
G1 X345.763 Y149.198
G1 X324.236 Y157
G1 X28 Y157
G2 X13 Y172 I=AC(28) J=AC(172)
G1 X13 Y172.675
G0 G60 Z102

G0 X424.719 Y25.467 S15915
G0 Z100.8
G1 G64 X101.922 Y25.467
G1 X17.541 Y-1.334
G2 X-2 Y12.962 I=AC(13) J=AC(12.962)
G1 X-2 Y67.5 Z=IC(0.01)
G2 X8 Y77.5 I=AC(8) J=AC(67.5)
G1 X335.763 Y77.5 Z=IC(-0.01)
G3 X345.763 Y87.5 I=AC(335.763) J=AC(87.5)
G1 X345.763 Y149.198
G1 X324.236 Y157
G1 X28 Y157
G2 X13 Y172 I=AC(28) J=AC(172)
G1 X13 Y230.675
G0 G60 Z102

Cordialement
re,
Le problème de lettre est du au retour a la ligne le programme s'arrête lorsqu'il arrive a une case vide
Derlig = Sheets(1).Cells(Lig_0, Col).Range("A10000").End(xlUp).Row 'lecture des données par le bas afin d'accepter les espaces
Peut on utiliser les valeurs commencent par X et Y ou sommes nous obliger d'avoir toujours la même positon de separ dans la cellule sinon pouvez vous rajouter un filtre afin d'extraire X et Y puis utiliser votre macro afin de transformer ces valeurs
cordialement
Merci Michel pour ton aide et tu n'a pas perdu ton temps car grâce a toi mon problème est résolut encore merci
Messages postés
54112
Date d'inscription
lundi 13 août 2007
Statut
Contributeur
Dernière intervention
21 juin 2021
16 107
Bonjour eristof23.

J'ai une solution sans macro, mais la formule fait "usine à gaz" :
=CAR(63+LIGNE()) & "=(" & SI(ESTTEXTE(SIERREUR(TROUVE(" ";B2;6);"?"));"?";STXT(B2;2;SIERREUR(TROUVE(" ";B2;6);"(?)")-1)) & ", " & SI(ESTTEXTE(SIERREUR(TROUVE(" ";B2;6);"?"));"?"; STXT(B2:B18;SIERREUR(TROUVE(" ";B2;6);"?")+2;8)) & ")"
Dans le fichier joint, cette formule est en colonne G, avec les données en A.
https://www.cjoint.com/c/EDdsOLkEhOR
Mais dans les colonnes B:F j'ai laissé les calculs intermédiaires qui m'ont amené à la solution finale.
Cette formule a été rendue (inutilement) compliquée à cause des données non conformes, comme G0 Z0.15 et G0 Z53.5 !
Si toutes les données avaient la même structure que G0 X0.000 Y47.359 la formule aurait été beaucoup plus simple (colonne H) :
=CAR(63+LIGNE()) & "=(" & STXT(B2;2;TROUVE(" ";B2;6)-1) & ", " & STXT(B2;TROUVE(" ";B2;6)+2;8) & ")"

Cordialement.
merci Raymon mais la solution ne fonctionne pas avec l exemple suivant

G0 G64 X424.719 Y25.467 A=DC(270) F9549 S11937 M3 M41 M8 M7 D1 H30=1
G0 Z101.3 M106 M22
G1 G64 X101.922 Y25.467
G1 X19.396 Y0.173
G2 X0 Y14.514 I=AC(15) J=AC(14.514)
G1 X0 Y67.5
G2 X10 Y77.5 I=AC(10) J=AC(67.5)
G1 X335.763 Y77.5
G3 X345.763 Y87.5 I=AC(335.763) J=AC(87.5)
G1 X345.763 Y149.198
G1 X324.236 Y157
G1 X28 Y157
G2 X13 Y172 I=AC(28) J=AC(172)
G1 X13 Y172.675
G0 G60 Z102

G0 X424.719 Y25.467 S15915
G0 Z100.8
G1 G64 X101.922 Y25.467
G1 X17.541 Y-1.334
G2 X-2 Y12.962 I=AC(13) J=AC(12.962)
G1 X-2 Y67.5 Z=IC(0.01)
G2 X8 Y77.5 I=AC(8) J=AC(67.5)
G1 X335.763 Y77.5 Z=IC(-0.01)
G3 X345.763 Y87.5 I=AC(335.763) J=AC(87.5)
G1 X345.763 Y149.198
G1 X324.236 Y157
G1 X28 Y157
G2 X13 Y172 I=AC(28) J=AC(172)
G1 X13 Y230.675
G0 G60 Z102

Cordialement
Messages postés
54112
Date d'inscription
lundi 13 août 2007
Statut
Contributeur
Dernière intervention
21 juin 2021
16 107 > eristof23
Normal : cet exemple ne ressemble pas du tout à celui que tu nous as fourni pour travailler !
Si la prochaine fois tu nous envoies le résultat des courses à Longchamp, les voix obtenues aux dernières élections ou un poème de Victor Hugo, ça ne marchera pas non plus ...
mais tu m'as fait passer un certain temps sur ta demande, inutilement : c'est regrettable !
Messages postés
16477
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
10 juin 2021
3 189
De même... et malheureusement fréquent par paresse:sous le thème "démerdez vous avec ça"

déclare test en byte
For test = 0 To UBound(Separ)
If Left(Separ(test), 1) = "X" Then Exit For
Next
Xxx = Right(Separ(test), Len(Separ(test)) - 1)
Yyy = Right(Separ(test + 1), Len(Separ(test + 1)) - 1)

Mais c'est la dernière fois que je passerai du temps pour toi.