by Guest » 21 Dec 2024, 11:02
Der folgende Code löst nur dann eine java.time.format.DateTimeParseException aus, wenn er in einer Windows 10-Umgebung (Version Version 10.0.19045.5247) ausgeführt wird. Ich habe es mit zwei verschiedenen JVMs, Graal JDK 17.0.2 und Eclipse Adoptium 11.0.15.10-Hotspot, von zwei verschiedenen IDEs (IntelliJ IDEA 2024.1.7 Ultimate und VS Code 1.96.2) getestet:
package com.xxx
import java.io.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
final File FILE = new File("C:\\Users\\xxx\\Downloads\\alarms.csv");
// example date: Dec 19, 2024 5:20:53 PM
final String DATE_PATTERN_REGEX = "\"([a-zA-Z]{3} [0-9]{1,2}, 2024 [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2} PM)\"";
final Pattern PATTERN = Pattern.compile(DATE_PATTERN_REGEX);
final String DATE_PATTERN = "MMM dd, yyyy KK:mm:ss a";
final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern(DATE_PATTERN);
try (BufferedReader br = new BufferedReader(new FileReader(FILE))) {
br.lines().forEach(line -> {
Matcher matcher = PATTERN.matcher(line);
List timestamps = new ArrayList(2);
while (matcher.find()) {
timestamps.add(LocalDateTime.parse(matcher.group(1), DATE_TIME_FORMAT));
}
if (timestamps.size() == 2) {
if (timestamps.get(0).equals(timestamps.get(1))) {
System.out.println(line);
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
Eine Beispielzeile der Datei alarms.csv ist die folgende:
major,"Dec 19, 2024 5:20:53 PM","Dec 19, 2024 5:21:00 PM",interface:xxx,onu-loss-of-phy-layer,"Event=loss of PHY connectivity with ONU due to missing bursts (LOFi/LOSi or LOBi), Serial-Number=xxx, Reg-ID=, CT-Name=xxx; model-name: xxx; description: xxx",0-1 min
Der vollständige Stack-Trace der ausgelösten Ausnahme lautet wie folgt:
java.time.format.DateTimeParseException: Text 'Dec 19, 2024 5:20:53 PM' could not be parsed at index 0
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2052)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1954)
at java.base/java.time.LocalDateTime.parse(LocalDateTime.java:494)
at com.xxx.Main.lambda$main$0(Main.java:25)
at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
at com.xxx.Main.main(Main.java:21)
Beachten Sie, dass diese Ausnahme nur ausgelöst wird, wenn ich diesen Code unter Windows ausführe. Als ich die Datei alarms.csv in meine WSL2-Umgebung (Ubuntu 20.04) verschoben und denselben Code in meiner WSL-Box mit Eclipse Adoptium 11.0.15.10-Hotspot ausgeführt habe, funktionierte es wie erwartet ordnungsgemäß.
Gibt es ein bekanntes Problem beim Parsen von CSV-Dateien in Windows, das die genannten JVMs betrifft? Wenn ja, was ist zu tun, um Abhilfe zu schaffen?
Der folgende Code löst nur dann eine java.time.format.DateTimeParseException aus, wenn er in einer Windows 10-Umgebung (Version Version 10.0.19045.5247) ausgeführt wird. Ich habe es mit zwei verschiedenen JVMs, Graal JDK 17.0.2 und Eclipse Adoptium 11.0.15.10-Hotspot, von zwei verschiedenen IDEs (IntelliJ IDEA 2024.1.7 Ultimate und VS Code 1.96.2) getestet:
package com.xxx
import java.io.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
final File FILE = new File("C:\\Users\\xxx\\Downloads\\alarms.csv");
// example date: Dec 19, 2024 5:20:53 PM
final String DATE_PATTERN_REGEX = "\"([a-zA-Z]{3} [0-9]{1,2}, 2024 [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2} PM)\"";
final Pattern PATTERN = Pattern.compile(DATE_PATTERN_REGEX);
final String DATE_PATTERN = "MMM dd, yyyy KK:mm:ss a";
final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern(DATE_PATTERN);
try (BufferedReader br = new BufferedReader(new FileReader(FILE))) {
br.lines().forEach(line -> {
Matcher matcher = PATTERN.matcher(line);
List timestamps = new ArrayList(2);
while (matcher.find()) {
timestamps.add(LocalDateTime.parse(matcher.group(1), DATE_TIME_FORMAT));
}
if (timestamps.size() == 2) {
if (timestamps.get(0).equals(timestamps.get(1))) {
System.out.println(line);
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
Eine Beispielzeile der Datei alarms.csv ist die folgende:
major,"Dec 19, 2024 5:20:53 PM","Dec 19, 2024 5:21:00 PM",interface:xxx,onu-loss-of-phy-layer,"Event=loss of PHY connectivity with ONU due to missing bursts (LOFi/LOSi or LOBi), Serial-Number=xxx, Reg-ID=, CT-Name=xxx; model-name: xxx; description: xxx",0-1 min
Der vollständige Stack-Trace der ausgelösten Ausnahme lautet wie folgt:
java.time.format.DateTimeParseException: Text 'Dec 19, 2024 5:20:53 PM' could not be parsed at index 0
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2052)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1954)
at java.base/java.time.LocalDateTime.parse(LocalDateTime.java:494)
at com.xxx.Main.lambda$main$0(Main.java:25)
at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
at com.xxx.Main.main(Main.java:21)
Beachten Sie, dass diese Ausnahme nur ausgelöst wird, wenn ich diesen Code unter Windows ausführe. Als ich die Datei alarms.csv in meine WSL2-Umgebung (Ubuntu 20.04) verschoben und denselben Code in meiner WSL-Box mit Eclipse Adoptium 11.0.15.10-Hotspot ausgeführt habe, funktionierte es wie erwartet ordnungsgemäß.
Gibt es ein bekanntes Problem beim Parsen von CSV-Dateien in Windows, das die genannten JVMs betrifft? Wenn ja, was ist zu tun, um Abhilfe zu schaffen?