Homepage von Jean-René Thies — Projekte & Tools rund um Java, Groovy, Grails, PHP, Scala, MySQL...
    « Time Warp mit dem Quartz SchedulerTutorial: CSVCheck (1) »

    Tutorial: CSVCheck (2)

    Permalink 22.07.07 09:42, von jrt, Kategorien: Project Plaza, Java , Schlagworte: csv, datenintegration, excel, transformation

    Im ersten Teil ging es um das Grundgerüst für einen Drag&Drop-Konverter für CSV-Daten, der daraus automatisch Excel-Dateien erzeugt. Der zentrale Bestandteil ist die Analyse der CSV-Daten und die Anreicherung mit eigenem Datenmaterial.
    In diesem Teil möchte ich nicht Details der Analyse darstellen (da hat sowieso jeder seine eigenen Anforderungen), sondern allgemeine Ansätze, um ein möglichst flexibles Programm zu bekommen.

    Fortsetzung:

    Flexibilität bedeutet für mich, dass ich ein Programm durch Konfiguration und nicht durch Änderungen in der Programmierung an aktuelle Aufgabenstellungen anpassen kann. Konfiguration kann ganz unterschiedlich aussehen: ein Optionen-Dialog im Programm, eine ausgelagerte XML-Datei, eine Datenbank...

    Mein CSV-Importer mit Excel-Ausgabe soll am Ende beliebig viele Prüfungen auf die Daten anwenden können. Jede Prüfung hinterlässt bei positivem Ergebnis eine Bemerkung in einer bestimmten Spalte der Excel-Datei (von der ich sicher weiß, dass sie keine wichtigen Daten enthält).

    Ein Datenprüfmodell
    Um das zu erreichen, müssen die Prüfungen standardisiert werden. In der einfachsten Form exisitert nur eine Bedingung wie "Feld Nr. 6 enthält Wert 5387". Weitere Möglichkeiten wären "Feld Nr. 3 enthält einen der Werte 321, 10, 77, 936, 12398" oder "Feld Nr. 5 enthält einen Wert >17 UND (Feld Nr. 23 enthält den Text 'wichtig' ODER Feld Nr. 24 enthält nicht den Text 'grün')". Das kann immer komplizierter werden.
    Ganz abstrakt betrachtet gehorchen diese Prüfungen dem Muster

    A und (B1 oder B2 oder B3 ...)

    mit genau einer Bedingung A und Null bis n Teilbedingungen B.
    Objektorientiert dargestellt:

    Ich habe hier also "Check"-Objekte für die A-Bedingung. Sie sind dazu bestimmt, definierte Prüfwerte (als String) in definierten Prüfspalten zu finden. Diesen Check-Objekten sind 0...* "CheckFeld"-Objekte zugeordnet. Und diese prüfen weitere Feldinhalte, indem sie Vergleiche mit Sollwerten vornehmen.
    Ich habe hier eine Typangabe hinzugefügt, um sowohl numerische als auch textliche Vergleiche vornehmen zu können. Der Operator ist ein String wie "<=", "<>" oder "=".

    Das Prüfprogramm wird später sämtliche Check-Objekte in eine Liste packen, mit einer einfachen for-Schleife durchlaufen und jedesmal alle Zeilen der CSV-Datei prüfen; entweder nur mit einer A-Bedingung oder zusätzlich mit beliebig vielen B-Bedingungen.

    Und damit komme ich wieder zum Thema Konfiguration: Die Check- und CheckFeld-Objekte lassen sich auslagern! Wenn mein Programm später an vielen Stellen mit unterschiedlichen Prüf-Anforderungen genutzt werden soll, muss die Änderung der Prüfbedingungen sehr einfach zu machen sein.
    Ich habe mich an dieser Stelle für eine Access-Datenbank entschieden, weil diese relativ schnell mit einer einfachen Eingabemaske versehen werden kann.
    Die Datenbank benötigt zwei Tabellen mit den im Klassendiagramm dargestellten Feldern. Das ist alles!

    Programmseitig brauche ich dann noch einen "CheckBuilder" zur Erzeugung der Check- und CheckFeld-Objekte aus der Datenbank. Den Zugriff auf Access habe ich hier schon gezeigt, daher gehe ich nicht mehr ins Detail.

    Die Klassen dieser Objekte sehen z.B. so aus:

    Code:

    import java.util.ArrayList;
     
    public class Check {
      
      private int id;
      private String checkname;
      private short pruefspalte;
      private String pruefwerte;
      private String hinweis;
      private ArrayList[lt]CheckFeld[gt] felder = new ArrayList[lt]CheckFeld[gt]();
      
      /** Creates a new instance of Check */
      public Check (int i, String a, short b, String c, String d) {
        id=i;
        checkname=a;
        pruefspalte=b;
        pruefwerte=c;
        hinweis=d;
      }
      
      public void addFeld(CheckFeld a) {
        felder.add (a);
      }
      
      public int getID() {
        return id;
      }
      
      public String getCheckname() {
        return checkname;
      }
      
      public short getPruefspalte() {
     
     
     
        return pruefspalte;
      }
      
      public String getPruefwerte() {
        return pruefwerte;
      }
      
      public String getHinweis() {
        return hinweis;
      }
      
      public ArrayList getFelder() {
        return felder;
      }
      
    }

    Code:

    public class CheckFeld {
      
      private Check check;
      private short spalte;
      private String typ;
      private String operator;
      private String vergleichswert;
      
      /** Creates a new instance of CheckFeld */
      public CheckFeld (Check a, short b, String c, String d, String e) {
        check=a;
        spalte=b;
        typ=c;
        operator=d;
        vergleichswert=e;
      }
      
      public Check getCheck () {
        return check;
      }
      
      public short getSpalte () {
        return spalte;
      }
      
      public String getTyp () {
        return typ;
      }
      
      public String getOperator () {
        return operator;
      }
      
      public String getVergleichswert () {
        return vergleichswert;
      }
      
    }

    Der Analyse-Teil des Programms beginnt nun mit

    Code:

    CheckBuilder cb = new CheckBuilder();
    ArrayList[lt]Check[gt] checks = cb.getChecks();
    for (Check check : checks) {

    ... und damit laufen alle Prüfungen der Reihe nach durch.

    Eine Sache noch: Feedback an den Benutzer. Das darf auf keinen Fall vergessen werden!

    Seiten: 1 · 2

    Noch kein Feedback

    Kommentare sind für diesen Eintrag deaktiviert.

    ©2012 by Jean-René Thies

    Kontakt |