Hallo zusammen!
Folgende Thematik:
Ich lese einen Logfile zeilenweise ein.
Dieser ist in bestimmte Abschnitte aufgeteilt, welche durch eine "ID(..)" gekennzeichnet sind, die je Abschnitt gleich ist.
Ist in einem solchen Abschnitt das Wort [checkConnection], soll der gesamte Abschnitt automatisch gelöscht werden.
Der Rest wird in eine neue Datei geladen. Habe auch ein Beispiel des LogFiles angefügt.
Dies habe ich auch soweit schon umgesetzt und es funktioniert. Habe dies mit einer ArrayList gelöst,
die, solange die ID´s die gleiche Zahl haben wird weiter zeilenweise eingelesen. Sobald eine neue Zahl kommt, wird die Liste (die
Zeile für Zeile beladen wird)
- entweder ganz gelöscht (wenn checkConnection vorkommt)
- oder in die neue Datei geschoben
Dann wird sie wieder neu beladen usw.
Nun ist der Haken bei der Sache, dass die ID´s teilweise durcheinander sind und sich ein bis zwei Zeilen eines Abschnittes
davor oder danach in einer Sequenz einschleichen. Siehe Beispiel unten.
Dies soll nun so sortiert werden, dass die Zeile, die nicht zum jeweiligen Abschnitt gehört, in den Abschnitt oben bzw. unten eingefügt
wird. --> hier ID(17), soll nach oben zu restlichen ID(17) geschoben werden.
Daher soll die Liste nicht nach jedem Abschnitt gelöscht werden, sondern bestehen bleiben, damit eventuell etwas verschoben werden kann.
LOGFILE-AUSZUG:
UND HIER NOCH MEIN BISHERIGER CODE:
Wie würdet ihr das am besten sortieren?
Vielen Dank schon mal für eure Tipps!!
Folgende Thematik:
Ich lese einen Logfile zeilenweise ein.
Dieser ist in bestimmte Abschnitte aufgeteilt, welche durch eine "ID(..)" gekennzeichnet sind, die je Abschnitt gleich ist.
Ist in einem solchen Abschnitt das Wort [checkConnection], soll der gesamte Abschnitt automatisch gelöscht werden.
Der Rest wird in eine neue Datei geladen. Habe auch ein Beispiel des LogFiles angefügt.
Dies habe ich auch soweit schon umgesetzt und es funktioniert. Habe dies mit einer ArrayList gelöst,
die, solange die ID´s die gleiche Zahl haben wird weiter zeilenweise eingelesen. Sobald eine neue Zahl kommt, wird die Liste (die
Zeile für Zeile beladen wird)
- entweder ganz gelöscht (wenn checkConnection vorkommt)
- oder in die neue Datei geschoben
Dann wird sie wieder neu beladen usw.
Nun ist der Haken bei der Sache, dass die ID´s teilweise durcheinander sind und sich ein bis zwei Zeilen eines Abschnittes
davor oder danach in einer Sequenz einschleichen. Siehe Beispiel unten.
Dies soll nun so sortiert werden, dass die Zeile, die nicht zum jeweiligen Abschnitt gehört, in den Abschnitt oben bzw. unten eingefügt
wird. --> hier ID(17), soll nach oben zu restlichen ID(17) geschoben werden.
Daher soll die Liste nicht nach jedem Abschnitt gelöscht werden, sondern bestehen bleiben, damit eventuell etwas verschoben werden kann.
LOGFILE-AUSZUG:
Code:
hh:mm:ss:ms () ID(17): >>BCD:
ABC
hh:mm:ss:ms () ID(16): >>------------------------------------------------------------<< ABC
hh:mm:ss:ms () ID(16): >>ABC
hh:mm:ss:ms () ID(16): >>ABC
hh:mm:ss:ms() ID(16): >>AttributeNames:
AB
hh:mm:ss:ms () ID(16): >>ParameterNames:
ABC
hh:mm:ss:ms () ID(16): >>a[checkConnection] wird nicht n?her untersucht.<< ABC
hh:mm:ss:ms() ID(16): >>BCD
<< ABC
hh:mm:ss:ms() ID(16): >>ABC
hh:mm:ss:ms() ID(16): >>1<< ABC
hh:mm:ss:ms () ID(17): >>ABC
hh:mm:ss:ms () ID(17): >><html><head><title>abc</title></head><body>
hh:mm:ss:ms() ID(20): >>------------------------------------------------------------<<
UND HIER NOCH MEIN BISHERIGER CODE:
Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.BufferedWriter;
import java.util.ArrayList;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import org.xml.*;
public class CheckConn2_1 {
public static void main(String[] args){
File outFile = new File(C://Zielpfad_neu.out");
String alt_ID = "";
String neu_ID = "";
StringBuffer zeile = null;
int i = 0;
boolean connection = false;
BufferedReader reader;
BufferedWriter bw;
PrintWriter pw;
// Einlesen der Datei und festlegen der Ausgabedatei
try{
FileInputStream fs = new FileInputStream("C://Quellpfad.log");
reader = new BufferedReader(new InputStreamReader (fs));
bw = new BufferedWriter(new FileWriter(outFile, false));
pw = new PrintWriter(bw);
// Erzeugen einer ArrayList für das Ablegen der Zeilen mit gleicher ID
ArrayList<StringBuffer> idList_1 =new ArrayList<StringBuffer>();
// XXX Liste, die alle Sektionen hält
ArrayList<ArrayList<StringBuffer>> sectionList = new ArrayList<ArrayList<StringBuffer>>();
while(true){
String tmp;
if( (tmp = reader.readLine()) != null )
zeile=new StringBuffer( tmp ); //zeilenweises einlesen
else zeile = null;
i++;
if(zeile==null){ //..bis zur letzten Zeile
if(connection==false){
for(int z=0; z < idList_1.size(); z++) {
pw.println(idList_1.get(z));
}
}
break;
}
// wenn die Zeile checkConnection enthält, setze connection auf true damit nicht rausgeschrieben wird
if(zeile.toString().contains("[checkConnection]")){
connection=true;
}
// suche nach Textstelle "ID()"
if(zeile.toString().contains("ID(")){
System.out.println(zeile.substring(42,44));
neu_ID = zeile.substring(42, 44); //schneidet die Zeile, bis auf die Position der Zahlen aus
if(i==1){
alt_ID=neu_ID;
}
if(!alt_ID.equals(neu_ID)){
alt_ID=neu_ID; //wenn die alte ID nicht der neuen gleicht, setze alt_ID auf neu_ID
if(connection==false){
for(int z=0; z < idList_1.size(); z++) { //Zeile um eins erhöhen
pw.println(idList_1.get(z));
}
}else{
idList_1.clear();
connection=false;
}
sectionList.add( new ArrayList<StringBuffer>( idList_1 ));
}else{
idList_1.add(zeile);
}
}else{
idList_1.add(zeile);
}
//Ideen
// wenn gesammelte Zeilen != checkConnection, dann
// sectionList.add( new ArrayList<StringBuffer>( idList_1 ));
// sonst, idList.clear() und fahre fort mit den weiteren neuen Zeilen bzw. oben
}
bw.close();
}catch (IOException ex){
ex.getMessage();
}
}
}
Wie würdet ihr das am besten sortieren?
Vielen Dank schon mal für eure Tipps!!