2010-05-31 18 views
5

Bir dosyayı satır bazında okuyorum ve bundan enlem ve boylamı ayıklamam gerekiyor. Bu nasıl hatları olabilir görünüyor: elbette öyle için ne varJava'dan RegEx'i kullanarak dize içinden iki çift Değerleri ayıkla

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 

, çiftler temsil olanlar hariç basamak çevrili hiçbir nokta yoktur. Maalesef nokta olmayan değerler var, bu nedenle String'in sonundaki sayıları kontrol etmek en iyisidir.

Yardımlarınız için teşekkürler!

cevap

3

Eğer 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

Bu benim favorim 'K.I.S.S. –

+0

Teşekkürler! Bu tamamen iş yaptı ve bahsettiğin gibi "K.I.S.S" es! – tzippy

3

Bu csv tablosu ayrılmış bir tablo mu? Sonra String # split'e bakmanızı ve sonuçta oluşan String dizisinden son iki alanı seçmenizi öneririm.

... neyse, csv olmasa bile, whitechars üzerinde bölünmüş ve String dizisinin son iki alanını al - bunlar lat/lon değerleridir ve bunları Double # parseDouble ile dönüştürebilirsiniz.

+0

Bölümleri sekmesini ayrılmış, fakat bazen birden fazla var olan iki segmenti ayıran sekme. – tzippy

+0

Bu önemli değil. –

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. .*? isteksizce
  2. (\\d+\\.?\\d*) bazı rakamları, isteğe bağlı bir ondalık nokta, biraz daha rakam
  3. \\s+ en az bir karakter yemek kullanabiliyorsa beyaz- boşluk karakteri (sekme karakteri gibi)
  4. (\\d+\\.?\\d*) bir rakam, isteğe bağlı bir ondalık, biraz daha fazla rakam
0

Bu çözelti Scanner.findWithinHorizon kullanır ve yakalama grupları:

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)) 
     ); 
    } 

Bu baskılar:

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

Not meta normal ifade yaklaşım "son" ifadesini oluşturmak için replace kullanma. Bu, "büyük resim" deseninin okunabilirliği için yapılır.

0

Bunu denedim:

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); 
    } 

O beyaz boşluk karşılaştığında dize böler. Koordinatlar her zaman son iki unsur olacağından, bunları herhangi bir problem olmadan basabilmeli. Aşağıda çıktı.

53,55 ,

47,983 10,0, 12,1278

0

bu ve boylam örneğin (45.23423,15 için aynı olmalıdır dize dışına enlem almak için doğru desen olduğunu düşünüyorum.23423) (birlikte veya virgülden sonra boşluk bırakmadan [,])

Cevap yukarıdaki aioobe en Yanıta göre:

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))); 
} 

alkış

İlgili konular