IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

expression régulière, extraction de coordonnées longitude, latitude


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    465
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 465
    Par défaut expression régulière, extraction de coordonnées longitude, latitude
    Bonjour,

    Dans un fichier, j'ai les coordonnées suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {\"latitude\": 43.311201614044528, \"longitude\": 5.4094707498763039}, {\"latitude\": 43.309623906531407, \"longitude\": 5.4086407626353283}, {\"latitude\": 43.309035100964323, \"longitude\": 5.4109002196409017}
    J'aimerais récupérer, d'une part les longitudes, d'autre part, les latitudes des points.

    Le code suivant, qui fonctionne, me récupère aussi les libellés "longitude" et "latitude" dans le résultat

    Ex. pour les longitudes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    posLon <- gregexpr("(longitude\": )[0-9\\.]+", fichier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    > longs
    [1] "longitude\": 5.4094707498763039}" "longitude\": 5.4086407626353283}"
    [3] "longitude\": 5.4109002196409017}"
    Aussi voulais-je savoir comment récupérer uniquement les coordonnées d'une seule traite..

    J'ai essayé avec les carets et fin de ligne afin d'indiquer ce que je veux exactement, mais sans succès
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    posLon <- gregexpr("(longitude\": )^([0-9\\.]+))", fichier)

  2. #2
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    Bonjour,

    Tu peux essayer avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    > x <- c("longitude\": 5.4094707498763039}", "longitude\": 5.4086407626353283}", "longitude\": 5.4109002196409017}")
     
    > as.numeric(sub("^[^[:digit:].]+([[:digit:].]+).*$", "\\1", x))
    [1] 5.409471 5.408641 5.410900

  3. #3
    Membre chevronné
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Par défaut
    Hello,

    Sinon on repartant du début, à ta place je ferais ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    fichier<-"{\"latitude\": 43.311201614044528, \"longitude\": 5.4094707498763039}, {\"latitude\": 43.309623906531407, \"longitude\": 5.4086407626353283}, {\"latitude\": 43.309035100964323,\"longitude\": 5.4109002196409017}"
     
    etape1<-unlist(strsplit(fichier,"\\}, \\{"))
    etape2<-gsub(pattern="[a-zA]|\"|\\{|\\}|:",replacement="",x=etape1)
    resultat<-strsplit(etape2,",")

    Ca tient en 3 lignes au lieu de potentiellement une ou deux sauf que:

    Les etapes intermediaires donnent des résultats très clairs.
    Tu as directement lattitude et longitude sans avoir à faire deux codes différents.
    Ca me parait plus élegant vu que tu as pas à écrire "latitude" "longitude" dans tes pattern ce qui fait un peu systeme d.

    La gueule du résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    [[1]]
    [1] " 43.311201614044528"  "5.4094707498763039"
     
    [[2]]
    [1] " 43.309623906531407"  "5.4086407626353283"
     
    [[3]]
    [1] " 43.309035100964323" " 5.4109002196409017"

    Chaque élement de la liste est un point à deux coordonnées.
    Chaque coordonnée est convertible directement en numeric via as.numeric() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    > as.numeric(resultat[[2]])[2]
    [1] 5.408641

  4. #4
    Membre chevronné
    Homme Profil pro
    MCU
    Inscrit en
    Juillet 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : MCU
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2010
    Messages : 185
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fichier <- "{\"latitude\": 43.311201614044528, \"longitude\": 5.4094707498763039}, {\"latitude\": 43.309623906531407, \"longitude\": 5.4086407626353283}, {\"latitude\": 43.309035100964323,\"longitude\": 5.4109002196409017}"
    results <- regmatches(fichier, gregexpr("[0-9\\.]+", fichier))
    results.formatted <- matrix(as.numeric(results[[1]]), ncol=2, byrow=TRUE)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    results.formatted
             [,1]     [,2]
    [1,] 43.31120 5.409471
    [2,] 43.30962 5.408641
    [3,] 43.30904 5.410900
    HTH

    Vincent

  5. #5
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    Bonjour,

    Citation Envoyé par Sengar Voir le message
    Sinon on repartant du début, à ta place je ferais ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    fichier<-"{\"latitude\": 43.311201614044528, \"longitude\": 5.4094707498763039}, {\"latitude\": 43.309623906531407, \"longitude\": 5.4086407626353283}, {\"latitude\": 43.309035100964323,\"longitude\": 5.4109002196409017}"
     
    etape1<-unlist(strsplit(fichier,"\\}, \\{"))
    etape2<-gsub(pattern="[a-zA]|\"|\\{|\\}|:",replacement="",x=etape1)
    resultat<-strsplit(etape2,",")
    J'aime bien cette solution.
    Pour la simplifier (expression régulière) et la compléter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    etape1 <- unlist(strsplit(fichier, "\\}, \\{"))
    etape2 <- gsub(pattern="[^[:digit:].,]", replacement="", x=etape1)
     
    resultat <- do.call(rbind, 
                        lapply(strsplit(etape2, ","),
                               as.numeric))
    Ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    > resultat
             [,1]     [,2]
    [1,] 43.31120 5.409471
    [2,] 43.30962 5.408641
    [3,] 43.30904 5.410900

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    465
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 465
    Par défaut
    bonjour,

    Je ne suis pas très bon en expression régulière. Je débute

    J'ai du mal à comprendre l'expression régulière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "^[^[:digit:].]+([[:digit:].]+).*$"
    Cela serait-il trop demander de me l'expliquer?
    - ^signifie bien début de chaîne? pourquoi apparaît il deux fois?
    - Le . signifie bien n'importe quel caractère? pourquoi le mettre parmi les chiffres? [:digit:]

    Désolé..

  7. #7
    Membre chevronné
    Homme Profil pro
    MCU
    Inscrit en
    Juillet 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : MCU
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2010
    Messages : 185
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "^[^[:digit:].]+([[:digit:].]+).*$"
    • Le "^" entre crochets et juste apres le crochet ouvrant signifie "tout sauf ce qui suit"
    • Je pense que le point est la pour representer le separateur decimal, il aurait peut-etre mieux fallu "echapper" comme cela a ete fait par la suite "\\." pour etre plus precis
    • Les parentheses sont la pour extraire ce qui est matche a l'interieur de celles-ci, l'extraction se fait avec "\\1" dans le gsub


    Donc en francais, "trouve un nombre precede de tout sauf un nombre et potentiellement suivi par quelque chose et concentre toi sur le nombre".

    HTH

    Vincent

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Expression régulière: extraction de sous-chaine
    Par Icegirl dans le forum Langage
    Réponses: 3
    Dernier message: 15/06/2014, 11h07
  2. Expressions régulières - Extraction de données Grep
    Par ritual dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 10/10/2008, 14h55
  3. Réponses: 6
    Dernier message: 03/03/2008, 18h39
  4. [RegEx] Extraction d'une partie d'une URL par expression régulière
    Par Maxbenji dans le forum Langage
    Réponses: 2
    Dernier message: 16/01/2007, 22h26
  5. [Expression régulière] - Extraction d'un email
    Par kirsoul dans le forum Langage
    Réponses: 2
    Dernier message: 23/05/2006, 14h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo