Extraire des données textes et les transformers

Résolu/Fermé
eristof23 - 2 avril 2015 à 18:07
 eristof23 - 12 avril 2015 à 22:42
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
A voir également:

4 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
2 avril 2015 à 18:54
Bonjour
Données sur une seule colonne ?
combien de lignes environ ?

D'avance merci
0
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
0
Raymond PENTIER Messages postés 58732 Date d'inscription lundi 13 août 2007 Statut Contributeur Dernière intervention 29 novembre 2024 17 247
2 avril 2015 à 18:57
Est-ce que les coordonnées ont toujours 3 décimales ?
0
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
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
Modifié par michel_m le 3/04/2015 à 11:00
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
0
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
0
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
0
Derlig = Sheets(1).Cells(Lig_0, Col).Range("A10000").End(xlUp).Row 'lecture des données par le bas afin d'accepter les espaces
0
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
0
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
0
Raymond PENTIER Messages postés 58732 Date d'inscription lundi 13 août 2007 Statut Contributeur Dernière intervention 29 novembre 2024 17 247
3 avril 2015 à 18:29
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.
0
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
0
Raymond PENTIER Messages postés 58732 Date d'inscription lundi 13 août 2007 Statut Contributeur Dernière intervention 29 novembre 2024 17 247 > eristof23
4 avril 2015 à 03:53
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 !
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
Modifié par michel_m le 4/04/2015 à 07:10
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.
0