Aller au contenu


Photo

Swift 3 - Supprimer caractères spéciaux (TAB, ...)


  • Please log in to reply
20 réponses à ce sujet

#1 Patyom

Patyom

    Cueilleur de cabosses

  • Membre
  • PipPipPip
  • 84 messages

Posté 31 mai 2017 - 23:11

Bonjour à tous

 

Je suis en train de tourner en rond car je n'arrive pas à trouver l'instruction pour retirer les caractères tels que : TAB, RC dans une chaine de caractères.

Je n'ai pas trop de connaissance en Swift, disons que j'apprends vite parce que j'ai déjà un bon passé en programmation.

 

Si quelqu'un pouvait me guider pour avancer dans la maitrise de Swift.

 

Merci   ;)  ;)



#2 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 794 messages
  • LocationParis

Posté 01 juin 2017 - 00:34

        // texte à filtrer
        let texte = "abcdef 0123456789"
        // Liste des caractères à éliminer
        let listeFiltrage:Set<Character> = ["b", "c", "e", "3", "8", "2"]

        let filtrage = String(texte.characters.filter {!listeFiltrage.contains($0)})
        print ("Avant : ",texte)
        print ("Après : ",filtrage)

a

 

Avant :  abcdef 0123456789

Après :  adf 0145679

 

a

Explications demain, là .. dodo !

 

Et n'hésite pas à te présenter ici : http://forum.cocoaca...on-des-membres/

 

On peut aussi définir les caractères à éliminer sous la forme d'une chaîne, avec cette syntaxe :

a

let listeFiltrage = Set("bce382".characters)

a

EDIT : Encodage d'un caractère spécial sous forme d'un Character

a

let caractereTAB:Character = "\u{09}"

a


Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#3 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 794 messages
  • LocationParis

Posté 01 juin 2017 - 08:35

Explication : .filter() permet de filtrer le contenu d'un tableau, avec un test indiquant si un élément doit être gardé ou éliminé.

 

Appliqué à une String, l'opérateur .Characters transforme celle-ci en un tableau de Characters.

let filtrage = String(texte.characters.filter {!listeFiltrage.contains($0)})

La condition de filtrage est l'appartenance à un Set (groupe) de caractères, ou plutôt la non-appartenance puisque j'ai ajouté l'opération de négation binaire (!).

 

En une seule ligne, j'indique à Swift de :

- créer un tableau de caractères à partir d'une chaîne

- parcourir ce tableau et en créer un nouveau en recopiant chaque caractère, sauf ceux contenus dans listeFiltrage

- créer une nouvelle chaîne à partir du tableau de copie


Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#4 Céroce

Céroce

    Mouleur de chocolats

  • Contrôleur d'arômes
  • 5 320 messages
  • LocationSaint-Leu-d'Esserent / France

Posté 01 juin 2017 - 09:03

Je trouve que le nom "filtrage" dans ton exemple est mal choisi, parce que ça fait penser qu'il s'agit d'une closure à appliquer pour filtrer.

J'aurais plutôt appelé la variable "texteFiltré".

Vois-tu ce que je veux dire ?


RenaudPradenc.com Je suis développeur iOS & Mac indépendant.

#5 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 794 messages
  • LocationParis

Posté 01 juin 2017 - 09:07

Tu as raison, mais je plaide qu'il était 1h30 du matin quand j'ai tapé ça en vitesse.. 


Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#6 iLandes

iLandes

    Torréfacteur de fèves

  • Membre
  • PipPipPipPipPip
  • 849 messages
  • LocationLandes

Posté 01 juin 2017 - 09:09

Il y a aussi 

 

https://developer.ap...mmingcharacters


--

seb@stien as iLandes

Linked In, Twitter, GitHub, StackOverFlowiLandes.fr

 

Applications : Plages.TVGirondins33Jardiner avec la luneDVRGVMidi Note Converter, FreeIMC.

 

It's not a bug, it's a feature.

Feature : A bug as described by the marketing department (Apple II Reference Manuel 1979 page 180)

 


#7 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 794 messages
  • LocationParis

Posté 01 juin 2017 - 09:14

Honte à moi. Je devrais lire la doc Apple en entier, un de ces jours ..

EDIT : Sauvé de la honte par Ceroce, qui a lu la doc


Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#8 Céroce

Céroce

    Mouleur de chocolats

  • Contrôleur d'arômes
  • 5 320 messages
  • LocationSaint-Leu-d'Esserent / France

Posté 01 juin 2017 - 09:25

 

Attention, ça n'ôte les caractères qu'en début et fin de chaîne.


RenaudPradenc.com Je suis développeur iOS & Mac indépendant.

#9 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 996 messages
  • LocationPlestin-les-Grèves (22)

Posté 01 juin 2017 - 09:57

Trouvé sur SO :

extension String
{
  func condenseWhitespace() -> String
  {
    return self.components(separatedBy: CharacterSet.whitespacesAndNewlines)
               .filter { !$0.isEmpty }
               .joined(separator: " ")
  }
}
  let bonString = mauvaisString.condenseWhitespace()


#10 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 794 messages
  • LocationParis

Posté 01 juin 2017 - 10:32

C'est pas bête d'utiliser une extension.

a

extension String {
    func nettoyage(intrus:String) -> String {
        let listeFiltrage = Set(intrus.characters)
        return String(self.characters.filter {
            !listeFiltrage.contains($0)
        })
    }
}

a

let apresNettoyage = texte.nettoyage(intrus: "bce382\u{09}")

a


Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#11 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 996 messages
  • LocationPlestin-les-Grèves (22)

Posté 01 juin 2017 - 12:16

C'est pas bête d'utiliser une extension.


Mais ce n'est pas nécessaire de passer le paramètre. On devrait jouer avec self

#12 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 794 messages
  • LocationParis

Posté 01 juin 2017 - 14:23

Le paramètre c'est la liste des caractères à exclure de la chaine.

 

L'exclusion de ton extension n'est pas paramétrable, contrairement à la mienne.

 

mais effectivement on pourrait écrire :

extension String {
    func nettoyageInterne() -> String {
        let listeFiltrage = Set("bce382\u{09}".characters)
        return String(self.characters.filter {
            !listeFiltrage.contains($0)
        })
    }
}

a

let apresNettoyage = texte.nettoyageInterne()

a


Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#13 Patyom

Patyom

    Cueilleur de cabosses

  • Membre
  • PipPipPip
  • 84 messages

Posté 02 juin 2017 - 10:48

hola, pas mal vos réponses, je les ai testé mais j'ai toujours un pb avec des espaces devant mon texte.

 

j'ai utilisé ce code :

page.texteDefinitif = page.texteDefinitif?.replacingOccurrences(of: "[\t\n\r]", with: "",options: .regularExpression)

et cette ligne pour ensuite ôter les espaces mais je ne suis pas convaincu. 


page.texteDefinitif = page.texteDefinitif?.replacingOccurrences(of: "      ", with: "",options: .regularExpression)

Pour l'instant il y a toujours 6 espaces devant, je n'aime pas le code ci-dessus pour retirer les espaces, j'aurais préféré une instruction type pour retirer ces espaces devant, instruction du genre "Trim" beaucoup plus sûr.

 

Bon j'avance, c'est déjà bien.



#14 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 794 messages
  • LocationParis

Posté 02 juin 2017 - 11:19

Le plus simple c'est de nous montrer ce que tu veux exactement. Un exemple de texte "avant" et un exemple "après".

 

Si as TOUJOURS 6 espaces vide devant tes chaînes, il suffit de créer une nouvelle chaîne en copiant les caractères à partir de la 7iéme position.


Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#15 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 996 messages
  • LocationPlestin-les-Grèves (22)

Posté 02 juin 2017 - 11:31

Je viens de tester ma solution et ça marche nickel.

extension String
{
  func condenseWhitespace() -> String
  {
    return self.components(separatedBy: CharacterSet.whitespacesAndNewlines)
               .filter { !$0.isEmpty }
               .joined(separator: " ")
  }
}
    let str = "     \t   \n fred   \t  is   cool "
    
    let trimmed = str.condenseWhitespace()
    
    print(trimmed)

Resultat : "fred is cool"



#16 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 996 messages
  • LocationPlestin-les-Grèves (22)

Posté 02 juin 2017 - 11:38

Si tu voulais seulement supprimer avant et après mas pas dans :

    let trimmed = str.trimmingCharacters(in: .whitespacesAndNewlines)

Ce qui te donnerait "fred   \t  is   cool"



#17 Patyom

Patyom

    Cueilleur de cabosses

  • Membre
  • PipPipPip
  • 84 messages

Posté 02 juin 2017 - 11:55

cool,

C'est exactement ce qu'il me fallait.

 

Pourrais-tu m'expliquer les différentes lignes dans le "func", toi ou un autre.

.joined(separator: " "

çà j'ai saisi

 

par contre le "self" çà doit correspondre au texte à modifier et que l'on retourne, non ?



#18 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 996 messages
  • LocationPlestin-les-Grèves (22)

Posté 02 juin 2017 - 12:07

  func condenseWhitespace() -> String
  {
    return self.components(separatedBy: CharacterSet.whitespacesAndNewlines) // créer components
    
               .filter { !$0.isEmpty } // filtrer les components en ignorant les vides
    
               .joined(separator: " ") // rassembler les components en string
  }

En effet, on appelle trois méthodes, l'une après l'autre, en utilisant le résultat de la méthode précédente suivi par le "."



#19 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 794 messages
  • LocationParis

Posté 02 juin 2017 - 12:15

 

par contre le "self" çà doit correspondre au texte à modifier et que l'on retourne, non ?

 

Oui et non, le self correspond à la valeur d'entrée de l'extension (le texte que l'on doit modifier). Mais le résultat retourné est une variable intermédiaire générée par le compilateur. Self n'est pas modifié pendant l'opération.


  • Joanna Carter aime ceci

Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#20 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 996 messages
  • LocationPlestin-les-Grèves (22)

Posté 02 juin 2017 - 12:25

cool,

C'est exactement ce qu'il me fallait.

 

Mais c'est exactement ce que je t'ai dit hier : http://forum.cocoaca...x-tab/?p=147414   ::)






0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)