2017-02-22 4 views
0

Ich habe eine Textdatei. Jede Zeile in der Datei stellt einen Datensatz mit einer Anzahl von Spalten dar, die durch ein | begrenzt sind (Rohr-) Zeichen. Die Spaltenwerte sind vom Typ int, string, date, timestamp usw. Leere Strings und Leerzeichen sind auch als Spaltenwerte möglich.Überprüfen Sie das Schema eines Datensatzes in Java

Ich überprüfe nur die Anzahl der Spaltenwerte und Validierung des Datentyps ist nicht erforderlich.

Beispiel gültige Aufzeichnungen von 5 Spalten je:

1234|xyz|abc|2016-04-08 11:12:40|234 
1235|efgh|abc|2016-04-09 11:25:40| 
1236|efghij| || 

Validierungscode:

boolean valid = true; 
String line = buffReader.readLine(); 
String[] tokens = null; 
while (line != null){ 
    tokens = line.split("\\|"); 
    if ((tokens.length==4 || tokens.length==5) && countPipes(line)==4){ 

    } else { 
     valid = false; 
     break; 
    } 
    line = buffReader.readLine(); 
} 

private int countPipes(String line){ 
    int count = 0; 
    count = line.length() - line.replace("|", "").length(); 
    return count; 
} 

Ich glaube, dass der Code besser sein kann. Kann jemand wissen lassen, wie ich diesen Code verbessern kann?

+0

Erlauben Sie es, dass '' 'in den Spaltenwerten maskiert wird? Wenn ja, muss Ihre Validierung damit umgehen. – dpr

+0

@RealSkeptic Danke für den Hinweis auf den Fehler. Ich habe es korrigiert. – Marco99

+0

@dpr Die Spaltenwerte haben kein "|" sicher. – Marco99

Antwort

1

Nun, können Sie einfach überprüfen, dass es vier sind Rohre in der Linie. Wenn es genau vier Pipes gibt, dann gibt es fünf Spalten, die leer sein können (was Sie erlauben).

while (line != null) { 
    if (countPipes(line) != 4) { 
     valid = false; 
     break; 
    } 
    line = buffReader.readLine(); 
} 

Jetzt müssen Sie die Linie überhaupt nicht aufteilen.

Ein Hinweis zum Teilen, obwohl. Wenn Sie die split mit zwei Parametern verwenden und eine negative Zahl verwenden, enthält der Split auch Einträge für die leeren Elemente. Hier ist eine Demonstration:

public class Test { 

    public static void main(String[] args) throws IOException { 
     String line = "A|B|||"; 

     String[] zeroSplit = line.split("\\|"); 
     String[] negativeSplit = line.split("\\|",-1); 

     System.out.println("When split without parameter: " + zeroSplit.length); 
     System.out.println("When split with negative parameter: " + negativeSplit.length); 
    } 
} 

Der Ausgang ist hier:

When split without parameter: 2 
When split with negative parameter: 5

Also in diesem Fall, können Sie überprüfen, ob Ihr Split ist genau die Länge 5, und das gleiche Ergebnis.

while (line != null) { 
    if (line.split("\\|",-1).length != 5) { 
     valid = false; 
     break; 
    } 
    line = buffReader.readLine(); 
} 
0

Zunächst einmal und am wichtigsten: Sie haben einen schwerwiegenden Fehler in Ihrer if-Anweisung, da Sie einen einzigen = (Zuweisungsoperator) anstelle des Vergleichsoperators == verwenden !!

Bezüglich Code Cleanup: Es ist nur eine leichte Anpassung und es gibt wahrscheinlich bessere Möglichkeiten, dies zu überprüfen, aber es ist das erste, was mir in den Sinn kam:

boolean valid = true; 
String line = buffReader.readLine(); 
while (valid && (line != null)){ 
    String[] tokens = line.split("\\|"); 
    valid = !(tokens.length == 4 || tokens.length == 5); 
    line = buffReader.readLine(); 
} 
+0

Danke für den Hinweis auf den Gleichheitsfehler. Ich habe es korrigiert. – Marco99

Verwandte Themen