Extraire des données textes et les transformers

Résolu
eristof23 -  
 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

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour
    Données sur une seule colonne ?
    combien de lignes environ ?

    D'avance merci
    0
    1. eristof23
       
      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
  2. Raymond PENTIER Messages postés 58226 Date d'inscription   Statut Contributeur Dernière intervention   17 490
     
    Est-ce que les coordonnées ont toujours 3 décimales ?
    0
    1. eristof23
       
      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
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
    1. eristof23
       
      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
    2. eristof23
       
      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
    3. eristof23
       
      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
    4. eristof23
       
      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
    5. eristof23
       
      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
  4. Raymond PENTIER Messages postés 58226 Date d'inscription   Statut Contributeur Dernière intervention   17 490
     
    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
    1. eristof23
       
      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
      1. Raymond PENTIER Messages postés 58226 Date d'inscription   Statut Contributeur Dernière intervention   17 490 > 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 !
        0
    2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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