Ich sitze gerade an einem Stück Code, und mich ärgert insbesondere die Kurzsichtigkeit der Ersteller der Daten ( namentlich IBM )
Die Datei einthält in der ersten Zeile die "Spaltenköpfe", und in den Zeilen 2 -n die Daten dazu.
Alles kein Problem, schon 100x gemacht. Nur leider wird IMHO ein ungeeigneter Delimiter verwendet. Einen Doppelpunkt zu verwenden, wenn die Daten auch Date/Time Werte enthalten können, das ist nicht sonderlich klug. Und es macht das Parsen solcher Daten nicht gerade einfacher.
Ich habe hier ein beispiel, wie die Header und Daten aussehen können ( Das Beispiel ist schon eine bereinigte Version der Rohdaten )
Was ich erreichen möchte ist eine Map aus den daten zu generieren, die als KEY den Header enthält und als WERT den korrespondierenden Eintrag im Datenstring.
| package de.eknori.sandbox; |
| |
| public class FileParser { |
| |
| private static String HEADERS = "User:Device:SMS Address:Nonce:Time Created:Time Requested:Time Executed:Security Flags:Security Flags Failed:Failure Reason Code:Requester ID:Approval State:Approver ID:Approval Time"; |
| private static String DATA1 = "CN=Kevin Kannix/OU=dau/O=dummstadt:FT88TDH7KP7V91GCH6R97MSLKO:null:2815699590:Tue Mar 07 09:13:02 CET 2017:Never:Never:none:none:0:null:Not required:null:Never"; |
| private static String DATA0 = "CN=Kevin Kannix/OU=dau/O=dummstadt:FT88TDH7KP7V91GCH6R97MSLKO:null:2815699590:Never:Never:Never:none:none:0:null:Not required:null:Never"; |
| |
| public static void main(String[] args) { |
| |
| try { |
| |
| String[] headers = {}; |
| headers = HEADERS.split(":"); |
| |
| String[] values = {}; |
| values = DATA0.split(":"); |
| |
| int i = 0; |
| for (String header : headers) { |
| |
| System.out.println(header.toUpperCase() + " = " + values[i]); |
| i++; |
| } |
| |
| } catch (Exception e) { |
| e.printStackTrace(); |
| } |
| |
| } |
| } |
Sieht dann für DATA0 so aus ( ist keine Map, weiss ich )
| USER = CN=Kevin Kannix/OU=dau/O=dummstadt |
| DEVICE = FT88TDH7KP7V91GCH6R97MSLKO |
| SMS ADDRESS = null |
| NONCE = 2815699590 |
| TIME CREATED = Never |
| TIME REQUESTED = Never |
| TIME EXECUTED = Never |
| SECURITY FLAGS = none |
| SECURITY FLAGS FAILED = none |
| FAILURE REASON CODE = 0 |
| REQUESTER ID = null |
| APPROVAL STATE = Not required |
| APPROVER ID = null |
| APPROVAL TIME = Never |
Nimmt man DATA1 dann ist das Ergebnis natürlich völlig unsinnig.
| USER = CN=Kevin Kannix/OU=dau/O=dummstadt |
| DEVICE = FT88TDH7KP7V91GCH6R97MSLKO |
| SMS ADDRESS = null |
| NONCE = 2815699590 |
| TIME CREATED = Tue Mar 07 09 |
| TIME REQUESTED = 13 |
| TIME EXECUTED = 02 CET 2017 |
| SECURITY FLAGS = Never |
| SECURITY FLAGS FAILED = Never |
| FAILURE REASON CODE = none |
| REQUESTER ID = none |
| APPROVAL STATE = 0 |
| APPROVER ID = null |
| APPROVAL TIME = Not required |
Was wäre euer Ansatz?
Bei den möglichen Date/Time Feldern steht immerhin ein TIME im header
