Zum Inhalt springen

Datei auslesen/durchsuchen


Empfohlene Beiträge

Geschrieben

Hallo zusammen,

Ich bin leider was Java angeht noch in den Kinderschuhen, habe bis jetzt mit Cobol Programmieren gelernt.

Die Datei die ich auslesen will sieht so aus:

Von: Arpwatch

Gesendet: Freitag, 29. November 2013 07:41

An: e-Mail-Adresse

Betreff: new station (IP-Adresse) eth0

hostname: <unknown>

ip address: xxx.xxx.xxx.xxx

interface: eth0

ethernet address: xx:xx:xx:xx:xx:xx

ethernet vendor: <unknown>

timestamp: Friday, November 29, 2013 7:41:23 +0100

Ich brauche alle Informationen ab Betreff und habe es so versucht zu lösen:


import java.io.BufferedReader;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;



public class test1 

{

	public static void main(String[]args)

	{

            String[] betreff = null;

	    try 

            {

		BufferedReader auslesen = new BufferedReader(new FileReader("C:/ARPWATCH/arp.txt"));

		String zeile = null;


		while((zeile = auslesen.readLine()) != null) 

		{

		    if (zeile.indexOf("Betreff: ") > -1)

		    {

			betreff = zeile.split("Betreff :");

			System.out.println(betreff);

		    }


		}

	     }

	     catch (FileNotFoundException e) 

	     {	} 

             catch (IOException e) 

             {

		// TODO Auto-generated catch block

		e.printStackTrace();

             } 

	}

}

Ich möchte gar keine "Fertiglösung", ich weiß nur nicht mit welchem Befehl ich es hinbekomme, das ich z.B. nach

dem Betreff suche und dann sagen kann, dass der String danach in die Variable String betreff geschoben werden soll.

Schon mal Danke im Vorraus für eure Hilfe.

LG Wiebke

Geschrieben

Da gibt's keine Patentlösung.

Möglichkeit A:

Deine Datei sieht von jetzt an bis in alle Ewigkeit gleich aus,

könntest Du mit Substrings arbeiten.

Vorteil: Ist einfach zu schreiben und als throwaway-code tolerabel

Nachteil: Wehe, wenn sich mal was ändert, dann kannst Du Deine Implementation überarbeiten.

Möglichkeit B:

Du arbeitest mit Regulären Ausdrücken.

Beispielsweise kannst Du damit den Betreff wie folgt ermitteln:


Betreff\s*.+)

[/code]

Das bedeutet in's Deutsche übersetzt:

Suche nach dem Wort Betreff gefolgt von keinem/beliebig vielen Whitespace-Zeichen (z.B. ein Leerzeichen) und einem Doppelpunkt. Wenn Du das gefunden hast, nimm alles, was Du nach dem Doppelpunkt findest und merke es Dir für die weitere verarbeitung.

Das klappt auch prima, sofern Du Inhalt hast, der auf eine Zeile beschränkt ist.

Mit [i]multilinematches[/i] wird es ein [i]wenig[/i] schwieriger.

Aber auch hier wird es haarig, wenn sich an der Struktur etwas ändert.

Hast Du irgendeinen Einfluß auf das Ausgabeformat?

Wenn ja, benutze besser Formate wie XML, JSON oder dergleichen.

Geschrieben

Hallo lilith2k3

Danke für deine schnelle Antwort.

Leider habe ich auf das Ausgabeformat keinen Einfluss.

Aber es dürfte sich an dem Dateiaufbau nichts ändern, da dises von einem festintegierten Programm geliefert wird,

welches auch in den nächsten Jahren nicht geändert werden soll.

Deine Beschreibung in Möglichkeit B entspricht auch schon dem was ich gesucht habe, ich konnte es nur einfach nicht so "zusammen bauen".

Vielen Dank!!!

Geschrieben

Am besten baust du dir ein Array mit den verschiedenen Suchbegriffen auf, über welches du iterierst.

sowas wie

for(String tempSuchString : suchStringArray) 

und vergleichst dann die eingelesene Zeile mit dem tempSuchString.

Beinhaltet dieser String den tempSuchString führst du den dazugehörigen regEx auf die Zeile aus.

Ich meine es wäre

String[] tempStringExtrahiert = zeile.split(regEx);

Ich glaube das liefert dir dann ein Array von Größe 1 mit dem Teilstring den du suchst.

Schlag mich aber nicht wenn es nicht ganz stimmt. Zur Not schaust du kurz in den debugger.

Geschrieben

Hallo, danke für die Antwort:-)

Ich hatte noch überlegt, ob es Sinn machen würde evt mit Switch Case zu arbeiten ungefähr so:


BufferedReader auslesen = new BufferedReader(new FileReader("C:/ARPWATCH/arp.txt"));

String zeile = null;


while((zeile = auslesen.readLine()) != null) 

{

    switch (zeile):

    {

        case(Betreff\s*.+))

          String betreff = zeile.split(Betreff\s*.+));

          break;


       case(hostname\s*.+))

          String hostname = zeile.split(hostname\s*.+));

          break;

[I]     usw[/I]

    }

}

[/code]

Geschrieben (bearbeitet)


for(String tempString : suchStrings) {

		    if (zeile.contains(tempString))

		    {

			String dummyString= zeile.split(REGEX1);

                        if(tempString.equals(suchstring1)) {

                            globaleVariableFuerDeinenWert1 = dummyString[0] 

                         }

                        else  if(tempString.equals(suchstring2)) {

                            globaleVariableFuerDeinenWert2 = dummyString[0] 

                         }

                         ...

		    }

}

so in etwa denke ich. Aber ich denke das kann man noch optimieren. Eleganter wäre es denke ich wenn du eine for schleife mit zählvariable machst und ein ergebnis array der gleichen länge hast. dann kannst du sowas machen wie

globaleVariableFuer[i] = dummyString[0]

und dann wäre in der If-Abfrage suchstring

Bearbeitet von hbspike
Geschrieben

Kommt denke ich auf deinen Geschmack an.

Ich würde es erstmal mit einem statischen Array von der gleichen Größe wie dein Suchstring-Array probieren.

Du könntest auch zur Übung es jeweils mit einer Liste und einer Map (z.B. HashMap) ausprobieren.

In die Map kannst du dann auch direkt deinen Suchstring + Wert eintragen.

Als kleines Beispiel:


HashMap<String,String> test = new HashMap<String,String>();

test.put(suchstring,ergebnis);

Geschrieben

So ich habe es wie folgt versucht:


public static void main(String[]args)

	{

	     String[] betreff = null;

             try 

	     {

		String betrefffinden = "^('Betreff'\t*.+))$";

		BufferedReader auslesen = new BufferedReader(new FileReader("C:/ARPWATCH/arp.txt"));

		String zeile = null;


		while((zeile = auslesen.readLine()) != null) 

		{

			/* 

			 * suche nach Betreff gefolgt von keinem/beliebig vielen Whitespaces und

			 * einem : nimm alles nach dem : und merk es dir zur weiteren verarbeitung

			 */


			betreff = zeile.split(betrefffinden);  	

			System.out.println(betreff);

		}

	}

	catch (FileNotFoundException e) 

	{		}

        catch (IOException e) 

        {

         	// TODO Auto-generated catch block

		e.printStackTrace();

	} 

}

[/code]

bekomme dabei aber nur diesen Kauderwelsch herraus:

post-88875-14430449729186_thumb.png

Was mache ich bei dieser Version falsch?

Geschrieben

Du gibts quasi nur das Array-Object aus, da das Programm bei so einem Zugriff auf die toString() Methode des Objektes ausführt. Nicht das eigentliche Feld.

probiere es mal mit


System.out.println(betreff[0]); //bzw 1 je nach dem. Aber ich glaube 1 wirft eine ArrayIndexOutOfBounds Exception

Geschrieben

Jedesmal? Dann ist eventuell etwas mit dem RegEx-Ausdruck nicht in Ordnung.

Kopier dir mal deine Datei in einen Online RegeX-Validator.

Damit kannste dann rumspielen und gucken welcher reguläre Ausdruck auf deine Suchzeile passt.

Kennst du dich mit dem Debugger aus? Sofern du eine IDE wie z.B. Eclipse benutzt, kannst du auch schrittweise durch das Programm gehen und genau gucken was es macht. Inklusive was in den Variablen steht. Das wäre mein nächster Schritt.

Geschrieben

Hallo,

jap immer, aber es ist definitiv der regex.

Ich hatte ihn auf einer Seite im Netz getestet und da sah er ganz gut aus.

Für meine Zeile:

Betreff: new station (189.284.954.393) eth0

habe ich die folgenden Regex versucht:


Betreff:\s.

^(Betreff:)\s.*

Betreff\s*.+)

^(Betreff:)\s.*$

^(Betreff:)\s*.+$

[/code]

die funktionieren nicht, aber es gibt ja auch so viele möglichkeiten.

Zudem nimmt mein Java \s nicht an, da bekomme ich Eclipse eine Fehlermeldung.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...