# Koordinaten aus einem Text filtern



## SteeL1942 (9. Jan 2010)

Ich habe folgendes Problem:

Ich möchte einen Text, der Koordinaten enthält (nach diesem System: (xxx|yyy) ), in einer Textarea einfügen und anschließend die Koordinaten auslesen und dann getrennt in Arrays speichern, also alle x-warte zusammen und alle y-werte zusammen. außerdem soll das programm mitzählen, wie viele koordinaten ausgelesen wurden und das anschließend in einem seperaten int-wert speichern.
momentan bin ich da recht ratlos, wie ich das lösen könnte...
Denke, dass ich meinen Programmcode nicht posten muss, denn großartig gibt es da ja noch nix  - nur die Textarea, ein Beenden-Knopf sowie der scan-Knopf ohne Funktion...

der Text, den ich einfügen will sieht so oder ähnlich aus. wie man sieht hat er ein gewisses muster. sämtliche zahlenwerte können sich ändern bzw sind von text zu text verschieden. auch die anzahl dieser zeilen ändert sich und wie gesagt - ich brauche nur die koordinaten. der rest ist überflüssig.

52:005:12 (227|502) K52 Hauptgeb?udePlatzMarktRekrutierenGruppe ?ndernAuf Karte zentrieren umbenennen     	 	 	 	 	15122 (30)  	0	0	0	1	0	0	75	0  	0  	235/235
52:005:22 (227|504) K52 Hauptgeb?udePlatzMarktRekrutierenGruppe ?ndernAuf Karte zentrieren umbenennen 						15266 (30) 	0	0	0	1	0	0	72	0 	0 	235/235
52:008:07 (242|501) K52 Hauptgeb?udePlatzMarktRekrutierenGruppe ?ndernAuf Karte zentrieren umbenennen 						15275 (30) 	0	0	0	2	0	0	0	0 	0 	235/235
52:025:04 (229|505) K52 Hauptgeb?udePlatzMarktRekrutierenGruppe ?ndernAuf Karte zentrieren umbenennen 						13158 (30) 	0	0	0	2	0	0	0	0 	0 	235/235
52:027:08 (238|506) K52 Hauptgeb?udePlatzMarktRekrutierenGruppe ?ndernAuf Karte zentrieren umbenennen 						13753 (30) 	0	0	0	2	0	0	0	0 	0 	235/235
52:029:19 (249|508) K52 Hauptgeb?udePlatzMarktRekrutierenGruppe ?ndernAuf Karte zentrieren umbenennen 						15077 (30) 	0	0	0	2	0	0	0	0 	0 	235/235
52:031:21 (256|509) K52 Hauptgeb?udePlatzMarktRekrutierenGruppe ?ndernAuf Karte zentrieren umbenennen 						13827 (30) 	0	0	0	3	0	0	0	0 	0 	235/235
52:046:24 (234|514) K52 Hauptgeb?udePlatzMarktRekrutierenGruppe ?ndernAuf Karte zentrieren umbenennen 						15918 (30) 	0	0	0	2	0	0	0	0 	0 	235/235
52:072:24 (264|519) K52 Hauptgeb?udePlatzMarktRekrutierenGruppe ?ndernAuf Karte zentrieren umbenennen 						200 (30) 	0	0	0	0	0	0	0	0 	0 	206/206
52:074:07 (272|516) K52 Hauptgeb?udePlatzMarktRekrutierenGruppe ?ndernAuf Karte zentrieren umbenennen 						200 (30) 	0	0	84	10	88	0	26	0 	0 	235/235
52:074:14 (274|517) K52 Hauptgeb?udePlatzMarktRekrutierenGruppe ?ndernAuf Karte zentrieren umbenennen 						15594 (30) 	0	0	0	2	0	0	0	0 	0 	235/235
52:075:16 (276|518) K52 Hauptgeb?udePlatzMarktRekrutierenGruppe ?ndernAuf Karte zentrieren umbenennen 						13291 (30) 	0	0	134	3	72	0	20	0 	0 	235/235
52:076:24 (284|519) K52 Hauptgeb?udePlatzMarktRekrutierenGruppe ?ndernAuf Karte zentrieren umbenennen 						15543 (30) 	0	0	0	1	0	0	92	0 	0 	235/235
52:093:04 (269|520) K52 Hauptgeb?udePlatzMarktRekrutierenGruppe ?ndernAuf Karte zentrieren umbenennen 						13324 (30) 	0	0	0	3	0	0	0	0 	0 	235/235
52:094:07 (272|521) K52 Hauptgeb?udePlatzMarktRekrutierenGruppe ?ndernAuf Karte zentrieren umbenennen 						12568 (30) 	0	0	0	3	0	0	0	0 	0 	235/235


----------



## madboy (9. Jan 2010)

Ein regulärer Ausdruck (regex) würde sich anbieten.
so was in der Art: 
	
	
	
	





```
"\\((\\d+)\\|(\\d+)\\)"
```
. Mittels Pattern und Matcher kannst du dann die Gruppen 1 und 2 auslesen, das wären dann die x- und y-Koordinaten.

Zum Thema regex, Pattern, Matcher am besten eine Suchmaschine der Wahl und die Java-Api bemühen


----------



## SteeL1942 (10. Jan 2010)

hab mich da jetzt mal schlau gemacht. hat auch ansatzweise funktioniert. zumindest liest er schonmal die erste Koordinate aus. die hab ich dann als String und müsste die nur irgendwie noch trennen. ich weis nur nicht, wie ich es hinbekomme, dass er alle ausliest...


```
//Import von Paketen
import java.awt.*;
import java.awt.event.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.text.AbstractDocument;

public class Main extends Frame {
	
	public static void main(String args[])
    {
        Main m = new Main();
        m.starte();
        m.setSize(600, 600);
        m.setVisible(true);
    }
	
	private TextArea Eingabe;
    Button EndeKnopf = new Button("Beenden");
    Button Rechne = new Button ("Rechne");
    String test;
    
// Konstruktor (besondere Methode)
public Main () 
    {
		Eingabe = new TextArea("");
        setTitle ("2010");
    }

void starte()
{    
        this.setLayout (null);
        
        Eingabe.setBounds(25,50,400,300);
        Rechne.setBounds(360,560,100,20);
        EndeKnopf.setBounds(480,560,100,20);

        add(Eingabe);
        add(Rechne);
        add(EndeKnopf);

        
        Rechne.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
            	test = findeKoods(Eingabe);
            	System.out.println(test);
                      }});
   
        EndeKnopf.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                setVisible(false);
                dispose();         
                System.exit(0);
            }
        });
        
    }



private String findeKoods (TextArea t)
{
	 Pattern pat = Pattern.compile("\\((\\d+)\\|(\\d+)\\)",Pattern.CASE_INSENSITIVE);
     Matcher mat = pat.matcher(t.getText());
     
     if(mat.find())
     {
         String result = mat.group(0);
         return result.substring("(".length(), result.length() - ")".length());
     }
     
     return null;
}
}
```


----------



## madboy (10. Jan 2010)

Gruppennummern fangen in dem Fall nicht bei 0 an, sondern bei 1 

Beispiel:

```
String t = "52:094:07 (272|521) K52 Hauptgeb?udePlatzMarktRekrutierenGruppe ?ndernAuf Karte zentrieren umbenennen 12568 (30) 0 0 0 3 0 0 0 0 0 235/235\n"
         + "52:093:04 (269|520) K52 Hauptgeb?udePlatzMarktRekrutierenGruppe ?ndernAuf Karte zentrieren umbenennen 13324 (30) 0 0 0 3 0 0 0 0 0 235/235";
      Pattern pat = Pattern.compile("\\((\\d+)\\|(\\d+)\\)",Pattern.CASE_INSENSITIVE);
      Matcher mat = pat.matcher(t);
      
      while(mat.find())
      {
          String x = mat.group(1);
          String y = mat.group(2);
          System.out.println(x + " " + y);
      }
```


----------



## SteeL1942 (10. Jan 2010)

Soweit läuft das jetzt. aber wie kann ich das jetzt mit der textarea benutzen? In deinem beispiel wird ja ein String benutzt. oder muss ich das von Textarea zu string konvertieren? wenn ja, wie mach ich das? mein programm sieht jez so aus:


```
//Import von Paketen
import java.awt.*;
import java.awt.event.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main extends Frame {
	
	public static void main(String args[])
    {
        Main m = new Main();
        m.starte();
        m.setSize(600, 600);
        m.setVisible(true);
    }
	
	private TextArea Import;
    Button EndeKnopf = new Button("Beenden");
    Button Rechne = new Button ("Rechne");
    String test;
    int [] xx;
    int [] yy;
    int n = 1;
    
// Konstruktor (besondere Methode)
public Main () 
    {
		Import = new TextArea("");
        setTitle ("2010");
    }

void starte()
{    
        this.setLayout (null);
        
        Import.setBounds(25,50,400,300);
        Rechne.setBounds(360,560,100,20);
        EndeKnopf.setBounds(480,560,100,20);

        add(Import);
        add(Rechne);
        add(EndeKnopf);

        
        Rechne.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
            	findeKoods();
            	System.out.println(test);
                      }});
   
        EndeKnopf.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                setVisible(false);
                dispose();         
                System.exit(0);
            }
        });
        
    }



private void findeKoods ()
{
	String t = "52:094:07 (272|521) K52 Hauptgeb?udePlatzMarktRekrutierenGruppe ?ndernAuf Karte zentrieren umbenennen 12568 (30) 0 0 0 3 0 0 0 0 0 235/235\n"
        + "52:093:04 (269|520) K52 Hauptgeb?udePlatzMarktRekrutierenGruppe ?ndernAuf Karte zentrieren umbenennen 13324 (30) 0 0 0 3 0 0 0 0 0 235/235";
 
	
     Pattern pat = Pattern.compile("\\((\\d+)\\|(\\d+)\\)",Pattern.CASE_INSENSITIVE);
     Matcher mat = pat.matcher(t);
     
     while(mat.find())
     {
         String x = mat.group(1);
         String y = mat.group(2);
         xx[n] = getZahl(x);
         yy[n] = getZahl(y);
         n = n+1;
     }
}

private int getZahl(String s){return Integer.valueOf(s).intValue();}
}
```


----------



## madboy (10. Jan 2010)

Mein Code war als Beispiel gedacht. Das mit der TextArea hat ja bei dir schon funktioniert. Suche also den Unterschied zwischen deinem vorherigen Code und meinem Beispiel und passe deinen Code entsprechend an. Kleiner Tip: es sind die Zeilen 65, 66 und 70 die geändert werden müssen.


----------



## SteeL1942 (10. Jan 2010)

Das klappt super, aber er zickt rum, wenn er die werte in die arrays schreiben soll. Das Problem ist in Zeile 72.
Fehlermeldugn ist diese:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at Main.findeKoods(Main.java:72)
	at Main.access$1(Main.java:63)
	at Main$1.actionPerformed(Main.java:47)
	at java.awt.Button.processActionEvent(Unknown Source)
	at java.awt.Button.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)



```
//Import von Paketen
import java.awt.*;
import java.awt.event.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main extends Frame {
	
	public static void main(String args[])
    {
        Main m = new Main();
        m.starte();
        m.setSize(600, 600);
        m.setVisible(true);
    }
	
	private TextArea Eingabe;
    Button EndeKnopf = new Button("Beenden");
    Button Rechne = new Button ("Rechne");
    String test;
    int [] xx;
    int [] yy;
    int n = 0;
    
// Konstruktor (besondere Methode)
public Main () 
    {
	Eingabe = new TextArea("");
        setTitle ("2010");
    }

void starte()
{    
        this.setLayout (null);
        
        Eingabe.setBounds(25,50,400,300);
        Rechne.setBounds(360,560,100,20);
        EndeKnopf.setBounds(480,560,100,20);
        
        add(Eingabe);
        add(Rechne);
        add(EndeKnopf);

        
        Rechne.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
            	findeKoods(Eingabe);
            	System.out.println(test);
                      }});
   
        EndeKnopf.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                setVisible(false);
                dispose();         
                System.exit(0);
            }
        });
        
    }



private void findeKoods (TextArea t)
{
     Pattern pat = Pattern.compile("\\((\\d+)\\|(\\d+)\\)",Pattern.CASE_INSENSITIVE);
     Matcher mat = pat.matcher(t.getText());
     
     while(mat.find())
     {
         String x = mat.group(1);
         String y = mat.group(2);
         xx[n] = getZahl(x);
         yy[n] = getZahl(y);
         n = n+1;
     }
}

private int getZahl(String s){return Integer.valueOf(s).intValue();}
}
```


----------



## SteeL1942 (10. Jan 2010)

das Problem mit den Arrays hat sich erledigt. Wie müsste ich das ganze denn anpassen, damit der auch Koordinaten einlesen kann, die keine Klammern haben also nur so: xxx|yyy


----------



## madboy (10. Jan 2010)

Der Ausdruck 
	
	
	
	





```
\\((\\d+)\\|(\\d+)\\)
```
 ist zwar nicht trivial durch die vielen Escapes aber doch auch nicht so komplex. Zwei Möglichkeiten: über regex lesen oder trial and error. Sooo viele Klammern sind in dem Ausdruck ja nicht, als dass du nicht probieren könntest, welche weg zu lassen wären ;-)


----------



## SteeL1942 (10. Jan 2010)

dass da klammern weg müssen, ist mir schon klar. ich hatte auch bevor ich gefragt hatte, einige "kombinationen" ausprobiert:

"\\(\\d+)\\|(\\d+)\\" Fehler: Exception in thread "AWT-EventQueue-0" java.util.regex.PatternSyntaxException: Unmatched closing ')' near index 4
\(\d+)\|(\d+)\

"\\\\d+\\|\\d+\\" Fehler: Exception in thread "AWT-EventQueue-0" java.util.regex.PatternSyntaxException: Unexpected internal error near index 10
\\d+\|\d+\

"\\(\\d+\\|\\d+\\)" Keine Fehlermeldung, aber er liest nichts ein


eine andere sinnvolle variante fällt mir nicht ein


----------



## madboy (10. Jan 2010)

Hmmm, ich dachte wenn das mit Probieren nicht hilft suchst du vielleicht nach Lösungen und liest was über reguläre Ausdrücke...
Aber egal:

```
(\\d+)\\|(\\d+)
```


----------



## SteeL1942 (10. Jan 2010)

joo jez läuft es. danke!


----------

