Wiebke88 Geschrieben 9. Dezember 2013 Geschrieben 9. Dezember 2013 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 Zitieren
lilith2k3 Geschrieben 9. Dezember 2013 Geschrieben 9. Dezember 2013 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. Zitieren
Wiebke88 Geschrieben 9. Dezember 2013 Autor Geschrieben 9. Dezember 2013 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!!! Zitieren
Wiebke88 Geschrieben 9. Dezember 2013 Autor Geschrieben 9. Dezember 2013 Ich war etwas zu vorschnell:-) Wie bau ich das denn in meinen Code ein, ich habe noch nicht viel mit regex gearbeitet. Danke! Zitieren
hbspike Geschrieben 9. Dezember 2013 Geschrieben 9. Dezember 2013 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. Zitieren
Wiebke88 Geschrieben 9. Dezember 2013 Autor Geschrieben 9. Dezember 2013 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] Zitieren
hbspike Geschrieben 9. Dezember 2013 Geschrieben 9. Dezember 2013 Ich bin mir nicht sicher in wieweit switch-case mit Regulären Ausdrücken funktioniert und switch-case auf Strings funktioniert nur im JDK 1.7. Zitieren
Wiebke88 Geschrieben 9. Dezember 2013 Autor Geschrieben 9. Dezember 2013 Ah ok. Das wusste ich nicht. Kannst du mir deine Idee noch etwas genauer erklären? Ich hab von allem "kleines Halbwissen". Zitieren
hbspike Geschrieben 9. Dezember 2013 Geschrieben 9. Dezember 2013 (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 9. Dezember 2013 von hbspike Zitieren
Wiebke88 Geschrieben 9. Dezember 2013 Autor Geschrieben 9. Dezember 2013 Das hört sich gut an, ich denke ich werde die Array variante testen, was ist da sinnvoller, ArrayList oder statisches Array? Zitieren
hbspike Geschrieben 9. Dezember 2013 Geschrieben 9. Dezember 2013 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); Zitieren
Wiebke88 Geschrieben 10. Dezember 2013 Autor Geschrieben 10. Dezember 2013 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: Was mache ich bei dieser Version falsch? Zitieren
Wiebke88 Geschrieben 10. Dezember 2013 Autor Geschrieben 10. Dezember 2013 Oder steht im Betreff dann nur die "Ortsangebe", wo der Betreff zu finden ist in der Mail? Zitieren
hbspike Geschrieben 10. Dezember 2013 Geschrieben 10. Dezember 2013 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 Zitieren
Wiebke88 Geschrieben 10. Dezember 2013 Autor Geschrieben 10. Dezember 2013 Ah eigentlich logisch. Jetzt gibt er aber nicht nur den Betreff aus, sondern die ganze Datei:old Zitieren
hbspike Geschrieben 10. Dezember 2013 Geschrieben 10. Dezember 2013 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. Zitieren
Wiebke88 Geschrieben 12. Dezember 2013 Autor Geschrieben 12. Dezember 2013 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. Zitieren
Empfohlene Beiträge
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.