Autor Thema: Kleine Fingerübung - Daten in Textfile parsen  (Gelesen 2386 mal)

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.718
  • Geschlecht: Männlich
Kleine Fingerübung - Daten in Textfile parsen
« am: 13.03.17 - 07:58:57 »
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.


Code
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 )

Code
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.

Code
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 :)
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.873
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: Kleine Fingerübung - Daten in Textfile parsen
« Antwort #1 am: 13.03.17 - 08:31:51 »
Ich glaube, ich würde ,mit einem Regex- Replace alle Vorkommnisse von " \d\d:\d\d:\d\d " durch z.b. " \d\d~\d\d~\d\d~ " ersetzen lassen.

Nach dem Parsen dann wieder umbenennen. Dann bist Du nicht auf den "korrekten" Header angewiesen.

Ansonsten müsstest Du wirklich von links nach rechts gehen und immer "alles rechts vom nächsten Doppelpunkt" nehmen, und den Wert dann prüfen, ob er "Never" oder eben ein Datumswert ist... ziemlich aufwändig...
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.718
  • Geschlecht: Männlich
Re: Kleine Fingerübung - Daten in Textfile parsen
« Antwort #2 am: 13.03.17 - 08:35:13 »
soo aufwändig ist es jetzt auch wieder nicht

Code
	public static void main(String[] args) {

		try {

			String[] headers = {};
			headers = HEADERS.split(":");

			String[] values = {};
			values = DATA1.split(":");

			int i = 0;
			for (String header : headers) {
				if (header.toUpperCase().contains("TIME") && !values[i].equalsIgnoreCase("never")) {
					System.out.println(
					        header.toUpperCase() + " = " + values[i] + ":" + values[i + 1] + ":" + values[i + 2]);
					i = i + 2;
				} else {
					System.out.println(header.toUpperCase() + " = " + values[i]);
				}
				i++;
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

	}
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.718
  • Geschlecht: Männlich
Re: Kleine Fingerübung - Daten in Textfile parsen
« Antwort #3 am: 13.03.17 - 08:36:41 »
Bleibt noch zu klären, was auf einem französichen Server mit bulgarischem Datumsformat im OS und installiertem türkischen LP, betrieben durch eine US Firma mit deutschem Admin passiert
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.718
  • Geschlecht: Männlich
Re: Kleine Fingerübung - Daten in Textfile parsen
« Antwort #4 am: 13.03.17 - 08:55:56 »
@Thorsten:

Aber deine Lösung ist natürlich eleganter; spart einiges an zusätzlichem Kram

Code
			String[] headers = {};
			headers = HEADERS.split(":");

			String[] values = {};
			values = DATA0.replaceAll("(\\d{1,2}):(\\d{1,2}):(\\d{1,2})", "$1#$2#$3").split(":");

			int i = 0;
			for (String header : headers) {
				System.out.println(header.toUpperCase() + " = " + values[i].replaceAll("#", ":"));
				i++;
			}
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.873
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: Kleine Fingerübung - Daten in Textfile parsen
« Antwort #5 am: 13.03.17 - 10:47:21 »
nun, ich hätte jetzt auch den "Rückwärts- replace" mit regex- gemacht, um versehentlich vorkommende #- Zeichen nicht auch zu "zerstören", aber prinzipiell: so in etwa hätte ich es auch gemacht...

Ach ja: Ich hätte ausserdem tatsächlich die leading und trailing spaces ins regex mit aufgenommen, weil je nach Aufbau des Headers ja auch so was vorkommen könnte:

Security Flags:Security Flags Failed:Failure Reason Code
7231:3:1714

und das würdest Du dann auch "replacen", aber Du kennst natürlich die Input- Files besser, und weisst, ob sowas überhaupt vorkommen kann...
« Letzte Änderung: 13.03.17 - 10:52:09 von Tode »
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.718
  • Geschlecht: Männlich
Re: Kleine Fingerübung - Daten in Textfile parsen
« Antwort #6 am: 13.03.17 - 10:56:36 »
ja, die spaces habe ich noch mit aufgenommen und das # durch ein Trennzeichen ersetzt, das unmöglich vorkommen kann.
Danke Dir für die geistige Unterstützung!
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.873
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: Kleine Fingerübung - Daten in Textfile parsen
« Antwort #7 am: 13.03.17 - 10:57:15 »
gerne ;)
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz