Überprüfung/Parsen eines Byte-Arrays

Sempah

Bekanntes Mitglied
Hallo zusammen,

ich hab den Inhalt einer CSV-Datei in einem Byte-Array (bzw. String) geladen und möchte nun den Inhalt überprüfen.

Aufbau der Datei:
Code:
Ueberschrift1;Ueberschrift2
A1;B1
A2;B2
A3;B3

Das Auslesen der Datei funktioniert, ich bekomme den Inhalt der Datei als byte-Array (also ASCII Werte mit CR, LR etc) bzw. wandle das Array in einen String um.

Ich möchte jedoch sicherstellen, dass in der Zeile1, Spalte1 "Ueberschrift1", in Zeile1, Spalte2 "Ueberschrift2" und in den folgenden Zeilen bspw. nur numerische Werte stehen.
Außerdem sollte nur 2 Spalten gefüllt sein und min. 2 Zeilen müssen gefüllt sein.

Variante1:
Zeichenweise durch das Byte-Array und dauerhafte Abfrage wann ein CR+LR kommt, wann ein ; kommt etc. -> sehr umständlich

Variante2:
Java:
		StringTokenizer tokenizer1 = new StringTokenizer(content);
		StringTokenizer tokenizer2 = null;
		int row = 0;
		int column = 0;
		String tmp = "";

		if (tokenizer1.countTokens() < 2) {
			throw new Exception("Es müssen mindestens 2 Zeilen gefüllt sein.");
		}
		
		while (tokenizer1.hasMoreTokens()) {
			row++;
			tokenizer2 = new StringTokenizer(tokenizer1.nextToken(), ";");
			
			if (tokenizer2.countTokens() > 2) {
				throw new Exception("Es sind mehr als 2 Spalten gefüllt.");
			}
			
			while (tokenizer2.hasMoreTokens()) {
				column++;
				
				tmp = tokenizer2.nextToken();
				
				if (row == 1) {
					if (column == 1) {
						if (!tmp.equals("Ueberschrift1")) {
							throw new Exception("Zeile 1, Spalte 1 != Soll, " + tmp);
						}
					} else if (column == 2) {
						if (!tmp.equals("Ueberschrift2")) {
							throw new Exception("Zeile 1, Spalte 2 != Soll, " + tmp);
						}
					} else {
						// ...
					}
				} else { // alles ab Zeile2
					// Ueberpruefung auf numerische Werte etc.
				}
				System.out.println(tmp);
			}
			column = 0;
		}
Hier wandle ich das Byte-Array in einen String um, und gehe die einzelnen Zeilen + Spalten mit 2 StringTokenizern durch. Diese Variante scheint mir schon ein wenig besser, jedoch auch nicht wirklich optimal zu sein.


Frage: Hätte jmd. einen besseren Vorschlag? (Die CSV-Datei steht mir zu diesem Zeitpunkt nicht mehr zur Verfügung, d.h. ich kann nicht mit einer CSV-Lib arbeiten.)
 
der Tokenizer-Code und if row = 1 else sind natürlich unschön, aber das kann man ja wegoptimieren, wenn man nur entsprechende Hintergrund-Klassen baut,
Gegenfrage: wie hättest du es denn gerne? irgendeine Art von Code muss da ja stehen

schreibe
Java:
CSVAnalyser x = ..;
check(x.rowCount() == 2, "Fehler xy");
check(x.rowIs(0,"Überschrift1","Überschrift2"), "Fehler xy");
for (int row = 1; row < x.rowCount(); row++) {
   Row r = x.getRow(row);
   check(r.size() == 2, "Fehler xy");
   check(r.containsOnlyNumber(), "Fehler xy"); // oder Schleife über Felder
}
fehlt nur ne Klasse CSVAnalyser, Row, check()-Methode usw 😉
die werden dann entsprechend komischen Code enthalten, der läßt sich nicht aus der Welt schaffen
 
Thx erst mal, jo stimmt schon, dass der Code irgendwo hin muss. Ist wahrscheinlich am besten, es in eine externe Class auszugliedern, damit ich nicht soviel "Parser"-Code in der eigtl. Class habe.
 
Hallo nochmal 😉

Gibt es in Java irgendeine Möglichkeit (z.B. durch Annotations o.Ä.), das Aufrufen bestimmter Methoden zu forcieren, sofern eine Instanz dieser Klasse erzeugt wird?

Kurzes Beispiel:
Java:
public class Test1 {

	private String test1 = null;
	private String test2 = null;
	
	public Test1(String test1) {
		this.test1 = test1;
	}
	
	// Wenn eine Instanz dieser Klasse erzeugt wird,
	// muss diese Methode ebenfalls aufgerufen werden
	public void setTest2(String test2) {
		this.test2 = test2;
	}
	
	public void printTest1Test2() {
		System.out.println(test1 + " " + test2);
	}
	
	public static void main(String[] args) {
		Test1 t1 = new Test1("string1");
        // Hier sollte ein "Fehler" zu Entwicklungszeiten stehen: 
		// setTest2(String test2) nicht implementiert
		t1.printTest1Test2();
	}
	
}

Verständlich was ich meine?
 
Zuletzt bearbeitet:
passt ja voll zu
> Überprüfung/Parsen eines Byte-Arrays
😉

ein derartiges Konzept habe ich noch nicht gesehen,
du kannst aber in printTest1Test2() eine Exception werfen, falls sich das Objekt nicht im gewünschten Zustand befindet,
oder nur einen Konstruktor/ eine Factory-Methode anbieten, der/ die alle benötigten Parameter enthält und setTest2() aufruft
 
Ja die Möglichkeiten habe ich auch schon bedacht, jedoch:

1. Exception: ich möchte diesen Hinweis schon zu Entwicklungszeiten feststellen
2. Konstruktor: so habe ich es im Moment, jedoch würde ich gerne die Anzahl der Parameter, welche ich im Konstruktor übergebe verringern.
 
tja, zaubern kann niemand, das ist zu exotisch für eine automatische Unterstützung

allgemein bedenken kannst du noch Wege der Art
Data1 d1 = new Data1(param1, param2, param3);
Data2 d2 = new Data2(param4, param5, param6);
Test1 t1 = new Test1(d1,d2);
 
Jo über diesen Weg habe ich auch schon nachgedacht.
Also ich hätte mir dann eine Klasse mit sämtlichen Eigenschaften geschrieben, die ich benötige und diese würde ich als Paramter dem Konstruktor übergeben.

Schade, wäre ziemlich sinnvoll so eine Annotation (wenn man z.B. mit mehreren Personen entwickelt, um so sicherzustellen, dass alle Methoden aufgerufen werden).
 
ne Annotation für sich hilft da kaum, die Entwicklungsumgebung oder der Compiler müsste den Lebenszyklus von Objekten verfolgen, ein ganz neues Thema,

ginge eh maximal innerhalb einer Methode, nicht über ein beliebig verknüpfes Netz, welches sich Gesamtprogramm nennt,
bisher kriegen es Compiler hin, zu erkennen, ob eine Variable null ist oder nicht, das ist schon eine Kunst, dagegen aber nur Kinderkram 😉 ,
na wie auch immer
 
Jo vielen Dank dennoch.
Meinte wie wenn man ein interface extended und Eclipse meckert, dass noch unimplemented methods fehlen.
 
Zuletzt bearbeitet:

Zurück
Oben