2010-05-31 6 views
5

Je lis un fichier par ligne et je dois en extraire la latitude et la longitude. Cette façon dont les lignes peuvent regards:Extrait deux valeurs doubles à partir de String en utilisant RegEx en Java

DE 83543 Rott am Inn Bayern BY Oberbayern  Landkreis Rosenheim 47.983 12.1278 
DE 21147 Hamburg Hamburg HH   Kreisfreie Stadt Hamburg 53.55 10 

Ce qui est sûr est, il n'y a pas de points entourés de chiffres, sauf pour ceux qui représentent les doubles. Malheureusement, il existe des valeurs sans point, il est donc préférable de vérifier les numéros à la fin de la chaîne.

merci pour votre aide!

Répondre

3

Si vous pouvez utiliser le java.lang.String#split()

//Split by tab 
String values[] = myTextLineByLine.split("\t"); 
List<String> list = Arrays.asList(values); 
//Reverse the list so that longitude and latitude are the first two elements 
Collections.reverse(list); 

String longitude = list.get(0); 
String latitude = list.get(1); 
+1

C'est mon préféré car il «implémente» K.I.S.S. –

+0

Merci! Cela a totalement fait le travail et comme vous l'avez mentionné "K.I.S" es! – tzippy

3

Est-ce une table csv séparée par tabulateur? Ensuite, je suggère de regarder String # split et en choisissant simplement les deux derniers champs du tableau String résultant.

... même si ce n'est pas le cas, diviser sur whitechars et prendre les deux derniers champs du tableau String - ce sont les valeurs lat/lon et vous pouvez les convertir avec Double # parseDouble.

+0

Les segments sont onglet séparés, mais parfois il y a plus d'un onglet qui sépare deux segments. – tzippy

+0

Cela n'aurait pas d'importance. –

0
Pattern p = Pattern.compile(".*?(\\d+\\.?\\d*)\\s+(\\d+\\.?\\d*)"); 
    Matcher m = p.matcher(s1); 
    if (m.matches()) { 
     System.out.println("Long: " + Double.parseDouble(m.group(1))); 
     System.out.println("Latt: " + Double.parseDouble(m.group(2))); 
    } 
  1. .*? manger des personnages à contre-cœur
  2. (\\d+\\.?\\d*) quelques chiffres, un point décimal en option, quelques chiffres
  3. \\s+ au moins un blanc- caractère espace (tel qu'un caractère de tabulation)
  4. (\\d+\\.?\\d*) quelques chiffres, un point décimal en option, quelques chiffres
0

Cette solution utilise Scanner.findWithinHorizon et groupes de capture:

import java.util.*; 
    import java.util.regex.*; 
    //... 

    String text = 
     "DE 83543 Blah blah blah 47.983 12.1278\n" + 
     "DE\t21147 100% hamburger beef for 4.99 53.55 10\n"; 

    Scanner sc = new Scanner(text); 
    Pattern p = Pattern.compile(
     "(\\w+) (\\d+) (.*) (decimal) (decimal)" 
      .replace("decimal", "\\d+(?:\\.\\d+)?") 
      .replace(" ", "\\s+") 
    ); 
    while (sc.findWithinHorizon(p, 0) != null) { 
     MatchResult mr = sc.match(); 
     System.out.printf("[%s|%s] %-30s [%.4f:%.4f]%n", 
      mr.group(1), 
      mr.group(2), 
      mr.group(3), 
      Double.parseDouble(mr.group(4)), 
      Double.parseDouble(mr.group(5)) 
     ); 
    } 

Ce imprime:

[DE|83543] Blah blah blah     [47.9830:12.1278] 
[DE|21147] 100% hamburger beef for 4.99 [53.5500:10.0000] 

Remarque l'approche méta-regex d'utiliser replace pour générer l'expression rationnelle "final". Ceci est fait pour la lisibilité du motif "grande image".

0

J'ai essayé:

public static void main(String[] args) 
    { 
     String str ="DE 83543 Rott am Inn Bayern BY Oberbayern Landkreis Rosenheim 47.983 12.1278"; 
     String str1 ="DE 21147 Hamburg Hamburg HH   Kreisfreie Stadt Hamburg 53.55 10 "; 

     String[] tempStr1 = str1.split("[ \t]+"); 

     System.out.println(tempStr1.length); 
     double latitude = Double.parseDouble(tempStr1[tempStr1.length - 2]); 
     double longitude = Double.parseDouble(tempStr1[tempStr1.length - 1]); 

     System.out.println(latitude + ", " + longitude); 
    } 

Il divise la chaîne chaque fois qu'il rencontre des espaces blancs. Puisque les coordonnées seront toujours les deux derniers éléments, il devrait être capable de les imprimer sans aucun problème. Voici la sortie.

53,55, 10,0

47,983, 12,1278

0

Je pense que c'est le bon modèle pour obtenir la latitude et la longitude de la chaîne qui doit correspondre par exemple (45.23423,15.23423) (avec ou sans espace après la virgule [,])

réponse basée sur au-dessus de la réponse du aioobe:

Pattern p = Pattern.compile("^(\\d+\\.?\\d*),\\s?(\\d+\\.?\\d*)$"); 
Matcher m = p.matcher(s1); 
if (m.matches()) { 
    System.out.println("Long: " + Double.parseDouble(m.group(1))); 
    System.out.println("Latt: " + Double.parseDouble(m.group(2))); 
} 

acclamations

Questions connexes