Supprimer caractères multiples SOH

Résolu
Informer -  
infonotaire Messages postés 8 Statut Membre -
Bonjour
Je tente de supprimer les caractères SOH en fin de chaîne dans l’élément lpstrFile de la structure appelé dans mon code typOpenFile, retourné par la fonction Opengetfile voir ici mon code complet en fin de post
https://stackoverflow.com/questions/57795303/delete-special-character-soh

Le patter appliqué est (^.*?(?=\x01))(\x01*) avec
sStr = .Execute(psStr)(0) 
sStr1 = .Replace(psStr, "$1") '


Et qui fonctionne parfaitement dans des testeurs internet

Merci par avance pour toute aide

2 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour, as-tu essayé le simple replace suggéré sur stackoverflow?
    peux-tu prouver qu'il reste des SOH après le replace?
    0
    1. infonotaire Messages postés 8 Statut Membre
       
      Bonjour testé mais pas d'avantage de succès
      Sur stackoverflow j’ai ajouté mon code de la fonction
      mfOpenFileDialog
      RegParse qui ne renvoie rien puisque avec ce pattern, j’ai une erreur alors que sur des testeurs internet ça fonctionne parfaitement

      sPathDefault = "c:\Extraction"
      sFileCrit = "rapport_"
      If mfOpenFileDialog(sPathDefault, sFileCrit) = False Then GoTo Exit_
      sPattern = "(^.*?(?=\x01))(\x01*)"
      sFileName = RegParse(typOpenFile.lpstrFile, sPattern)
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > infonotaire Messages postés 8 Statut Membre
         
        peux-tu prouver qu'il reste des SOH après le replace? il suffit d'afficher le code de chacun des caractères, ou de tester si il y reste bien un SOH.
        0
    2. infonotaire Messages postés 8 Statut Membre
       
      Bonjour yg_be

      Copie/colle le code entier maintenant disponible sur stackoverflow et et applique la fonction replace sur sFileName et tu verras que les caractères seront toujours présent
      Tu pourras le vérifier en copiant la valeur de sFileName soit par debug.print ou en plaçant sFileName dans la fenêtre espion VBA pour le coller dans Notepad++

      Mais ma question initiale ne porte pas sur replace qui de toute façon est inopérant mais sur RegExp qui provoque une erreur avec sPattern = "(^.*?(?=\x01))(\x01*)" alors que fonctionne très bien sur des sites de test en ligne comme tu peux le voir sur mon poste ici [URL][[https://www.developpez.net/forums/d2002105/logiciels/microsoft-office/excel/macros-vba-excel/regexp-suppression-caracteres-soh/#post11114221[/URL]]

      De plus dans ce post tu peux récupérer un fichier new1.txt avec des caractères SOH , coller son contenu dans une variable positionnée dans la fenêtre espion de l’éditeur VBA et la passer dans Replace et tu verras que rien ne se passe
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > infonotaire Messages postés 8 Statut Membre
         
        chez moi, le replace fonctionne parfaitement:
        Private Sub soh()
        Dim str As String, str2 As String
        str = "V:\result_1567413789250.csv"
        Debug.Print Len(str), str
        str2 = Replace(str, Chr(1), "", , , vbBinaryCompare)
        Debug.Print Len(str2), str2
        End Sub

        47 V:\result_1567413789250.csv
        27 V:\result_1567413789250.csv
        0
  2. infonotaire Messages postés 8 Statut Membre
     
    yb_be,

    Merci pour ton aide mais si tu initialises ta variable "str" SANS caractères SOH, ça me parait normal que ta variable str2 n'est pas de caractères SOH après un Replace.
    Avec le code de ton exemple, même sans Replace tu auras str2 sans SOH

    Vois plutôt ce que Replace donne après avoir implémenté mon code en modifiant
    sPathDefault
    sFileCrit
    strFilter

    Et tu verras que Replace ne fonctionne pas comme montré dans l'image
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      dans mon test, str contient des SOH, str2 est plus court parce que les SOH de str ne sont plus présents dans str2.
      peux-tu tester ceci?
      Private Sub soh()
      Dim str As String, str2 As String
      str = "V" + CStr(Chr(1)) + "W"
      showchar (str)
      str2 = Replace(str, Chr(1), "", , , vbBinaryCompare)
      showchar (str2)
      End Sub
      Private Sub showchar(inp As String)
      Dim i As Long
      Debug.Print Len(inp), inp
      For i = 1 To Len(inp)
          Debug.Print Asc(Mid(inp, i, 1))
      Next i
      End Sub

      je testerai ton exemple avec plaisir dès que tu auras partagé le texte de ton code, et pas une image.
      suggestions:
      1) ajouter
      option explicit
      en début de code
      2) ajouter ma sub showchar pour vérifier le contenu après le replace.
      0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > infonotaire Messages postés 8 Statut Membre
       
      j'ai testé avec ton code, et je n'ai aucun SOH. j'ai par contre des NULL, que j'élimine facilement ainsi:
      sFileName = _
              Left(typOpenFile.lpstrFile, _
              InStr(1, typOpenFile.lpstrFile, CStr(Chr(0)), vbBinaryCompare) - 1)

      as-tu testé
      Call showchar(typOpenFile.lpstrFile)
      , tu aurais vite remarqué qu'il ne s'agit pas de SOH?
      0
    3. infonotaire Messages postés 8 Statut Membre
       
      yg_be, grâce à ton aide la question 1.2 Replace est résolue car effectivement c'est du chr(0) et non du Chr(1) qui est dans la variable.
      Un truc bizarre s'est passé quand j'ai copier/coller la valeur dans Notepad++.

      J'ajoute à ma collection de routines sympa, ta fonction ShowChar que j'ai par ailleurs modifié pour visualiser facilement les valeurs dans la fenêtre Espions de l'éditeur VBA
      Public Function mfShowChar(psStr As String)
      Dim i As Integer
      Dim arrChar() As Integer

      For i = 1 To Len(psStr)
      ReDim Preserve arrChar(i)
      arrChar(i) = Asc(Mid(psStr, i))
      Next

      End Function

      On peut alors utiliser REPLACE
      sStr = Replace(typOpenFile.lpstrFile, Chr(0), vbNullString)
      0
    4. infonotaire Messages postés 8 Statut Membre
       
      Je dois maintenant tester le RegExp sur le /x00... A suivre et encore merci yg_be pour ton aide
      0