Aus mehreren Zeilen bestimmte Teile auslesen

Status
Nicht offen für weitere Antworten.

Vril

Bekanntes Mitglied
Hallo,

ich versuche gerade ein kleines Programm zu schreiben das einen Pingtest durchführt. So schaut das ganze momentan aus und funktioniert auch schon ganz gut:
Code:
import java.io.*;

public class Pingtest{
	
	public static void main(String[] args){
	
	 try{
	  
	  for(int i=0; 10>i; i++){
	 
	  Process proc = Runtime.getRuntime().exec("ping heise.de");
	  
	  
      BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream())); 
      String strLine = ""; 
      
      
      while ( ( strLine = in.readLine() ) != null) 
      { 
           System.out.println(strLine); 
      }} }catch (IOException e){System.err.println(e);}

}}
Der Pingtest beinhaltet ja ca. 9 Zeilen. Jetzt würde ich aus diesen Zeilen jeweils die Zahl bei Verloren (Anzahl der Verlorenen Pakete) und die Zahl bei Mittelwert herauslesen um sie später z. B. einer Statistik zurechnen zu können!

Hat zufällig jemand eine Idee wie das funktionieren könnte?
 
Speichere halt zusätzlich die Ausgabe z. B. in nem StringBuffer (oder ab 1.5 StringBuilder) und teile es dann mit split oder so auf (sollten ja alle das selbe Format haben). Dann noch alle benötigten Zahlen schön in nen Integer parsen und scho kannste nach herzenslust rechnen :wink:
 
mach mal lieber

ping -c <anzahl> heise.de

damit der Prozess auch aufhört, dann findest du alles in der letzen zeile

<anzahl> packets transmitted, <anzahl> received, <prozent>% packet loss, time 10999ms

und lässt einen regex drauf los
 
Code:
import java.io.*;

public class Pingtest{
	public static int j;
	public static void main(String[] args){
	
	 try{
	  
	  for(int i=0; 1>i; i++){
	 
	  Process proc = Runtime.getRuntime().exec("ping heise.de");
	  
	  
      BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream())); 
      String strLine = ""; 
      
      BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
      	new FileOutputStream("messung.txt")));
      
      while ( ( strLine = in.readLine() ) != null) {
      
     	   
     	   
      
           System.out.println(strLine); 
           out.write(strLine);
     
     } in.close(); out.close();
    } 
   }
   catch (IOException e){System.err.println(e);}

  }
}
 
Bleiglanz hat gesagt.:
mach mal lieber

ping -c <anzahl> heise.de

damit der Prozess auch aufhört, dann findest du alles in der letzen zeile

<anzahl> packets transmitted, <anzahl> received, <prozent>% packet loss, time 10999ms

und lässt einen regex drauf los

?? schonmal daran gedacht, das die meisten Leute Windows haben, da heißt die Funktion -s und man kann nur 1-4 angeben, man müsste also vorher das System abfragen...
 
ops..sorry hab' mich vertan mit dem Zeiteintrag, was auch immer das ist:

Syntax: ping [-t] [-a] [-n Anzahl] [-l Größe] [-f] [-i Gültigkeitsdauer]
[-v Diensttyp] [-r Anzahl] [-s Anzahl] [[-j Hostliste] |
[-k Hostliste]] [-w Zeitlimit] Zielname

Optionen:
-t Sendet fortlaufend Ping-Signale zum angegebenen Host.
Geben Sie STRG-UNTRBR ein, um die Statistik anzuzeigen.
Geben Sie STRG-C ein, um den Vorgang abzubrechen.
-a Löst Adressen in Hostnamen auf.
-n n Anzahl Anzahl zu sendender Echoanforderungen
-l Länge Pufferlänge senden
-f Setzt Flag für "Don't Fragment".
-i TTL Gültigkeitsdauer (Time To Live)
-v TOS Diensttyp (Type Of Service)
-r Anzahl Route für Anzahl der Abschnitte aufzeichnen
-s Anzahl Zeiteintrag für Anzahl Abschnitte
-j Hostliste "Loose Source Route" gemäß Hostliste
-k Hostliste "Strict Source Route" gemäß Hostliste
-w Zeitlimit Zeitlimit in Millisekunden für eine Rückmeldung
 
Ok, wenn ich also ping heise.de -n 10 schreibe führt er mir das ganze 10 mal aus. Aber hinsichtlich dem Zeitstempel bin ich leider immer noch nicht weitergekommen. Es wäre nicht schlecht wenn bei jedem Ping auch die genaue Zeit/Datum dabei stehen würde wann der Ping ausgeführt wurde.

@Bleiglanz
Was meinst du mit einem Regex?
 
Beispiel
Code:
        String lastLine = "10 packets transmitted, 10 received, 0% packet loss, time 9007ms";

        Pattern pingMuster = Pattern
                .compile("(\\d+)\\D*(\\d+)\\D*(\\d+)\\D*(\\d+)\\D*"); 
        Matcher treffer = pingMuster.matcher(lastLine);
        if (treffer.matches()) {
            System.out.println("transmitted:" + treffer.group(1)); 
            System.out.println("received:" + treffer.group(2)); 
            System.out.println("% loss:" + treffer.group(3)); 
            System.out.println("time:" + treffer.group(4)); 
        }
und zum aktuellen Datum:

mach halt ein out.write(String.valueOf(new java.util.Date())) bei deiner Ausgabe in die Datei mit dazu?
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben