Java Regex extrahiert bestimmte Werte im langen Protokoll
Ich habe einen sehr langen Text und extrahiere einige bestimmte Werte, denen bestimmte Wörter folgen. Hier ist ein Beispiel für meinen langen Text:
.........
FPS(FramesPerSecond)[ValMin: 29.0000, ValMax: 35.000]
.........
TotalFrames[ValMin: 100000, ValMax:200000]
.........
MemoryUsage(In MB)[ValMin:190000MB, ValMax:360000MB]
.........
Hier ist mein Code:
File file = filePath.toFile();
JSONObject jsonObject = new JSONObject();
String FPSMin="";
String FPSMax="";
String TotalFramesMin="";
String TotalFramesMax="";
String MemUsageMin="";
String MemUsageMax="";
String log = "my//log//file";
final Matcher matcher = Pattern.compile("FPS/\(FramesPerSecond/\)/\[ValMin:");
if(matcher.find()){
FPSMin= matcher.end().trim();
}
Aber ich kann es nicht zum Laufen bringen. Wo irre ich mich Grundsätzlich muss ich für jeden String die entsprechenden Werte (max und min) auswählen, die aus diesem langen Text stammen, und sie in den Variablen speichern. Mögen
FPSMin = 29.0000
FPSMax = 35.0000
FramesMin = 100000
Etc
Vielen Dank
BEARBEITEN: Ich habe den folgenden Code (in einem Testfall) ausprobiert, um festzustellen, ob die Lösung funktionieren kann. Es treten jedoch Probleme auf, da ich nur ein Objekt drucken kann. Hier ist der Code:
@Test
public void whenReadLargeFileJava7_thenCorrect()
throws IOException, URISyntaxException {
Scanner txtScan = new Scanner("path//to//file//test.txt");
String[] FPSMin= new String[0];
String FPSMax= "";
//Read File Line By Line
while (txtScan.hasNextLine()) {
// Print the content on the console
String str = txtScan.nextLine();
Pattern FPSMin= Pattern.compile("^FPS\\(FramesPerSecond\\)\\[ValMin:");
Matcher matcher = FPSMin.matcher(str);
if(matcher.find()){
String MinMaxFPS= str.substring(matcher.end(), str.length()-1);
String[] splitted = MinMaxFPS.split(",");
FPSMin= splitted[0].split(": ");
FPSMax = splitted[1];
}
System.out.println(FPSMin);
System.out.println(FPSMax);
}
Antworten
Vielleicht sollte dein Muster so sein ^FPS\\(FramesPerSecond\\)\\[ValMin:. Ich habe es versucht und es funktioniert für mich.
String line = "FPS(FramesPerSecond)[ValMin: 29.0000, ValMax: 35.000]";
Pattern pattern = Pattern.compile("^FPS\\(FramesPerSecond\\)\\[ValMin:");
Matcher matcher = pattern.matcher(line);
if (matcher.find()) {
System.out.println(line.substring(matcher.end(), line.length()-1));
}
}
Auf diese Weise erhalten Sie den Versatz der Zeile, die Sie extrahieren möchten, und mit der Teilzeichenfolgenfunktion können Sie alle Zeichen vom Versatz bis zur Größe der Zeile 1 abrufen (da Sie nicht auch das Zeichen] erhalten möchten).
Der folgende reguläre Ausdruck stimmt mit dem Namen min und max überein und erfasst ihn:
Pattern.compile("(.*)\\[.+:\\s*(\\d+(?:\\.\\d+)?)[A-Z]*,.+:\\s*(\\d+(?:\\.\\d+)?)[A-Z]*\\]");
Verwendung (Extrahieren der erfassten Gruppen):
String input = (".........\n" +
"FPS(FramesPerSecond)[ValMin: 29.0000, ValMax: 35.000]\n" +
".........\n" +
"TotalFrames[ValMin: 100000, ValMax:200000]\n" +
".........\n" +
"MemoryUsage(In MB)[ValMin:190000MB, ValMax:360000MB]\n" +
".........");
for (String s : input.split("\n")) {
Matcher matcher = pattern.matcher(s);
if (matcher.matches()) {
System.out.println(matcher.group(1) + ", " + matcher.group(2) + ", " + matcher.group(3));
}
}
Ausgabe:
FPS (FramesPerSecond), 29.0000, 35.000
TotalFrames, 100000, 200000
MemoryUsage (In MB), 190000, 360000