Frage

Im Grunde habe ich eine Flat-Datei in eine Datenbank zu erhalten. Die flachen Dateien kommen in den ersten beiden Zeichen in jeder Zeile angibt, welche Art der Aufzeichnung ist.

erstelle ich eine Klasse für jeden Datensatztyp mit Eigenschaften, um die Felder im Datensatz passend? Sollte ich nur Arrays verwenden?

Ich möchte die Daten in eine Art von Datenstruktur laden, bevor sie in der Datenbank gespeichert, so dass ich Unit-Tests verwenden können, um sicherzustellen, dass die Daten korrekt geladen wurde.

Hier ist ein Beispiel dessen, was ich mit (BAI2 Kontoauszüge) arbeiten:

01,121000358,CLIENT,050312,0213,1,80,1,2/

02,CLIENT-STANDARD,BOFAGB22,1,050311,2359,,/

03,600812345678,GBP,fab1,111319005,,V,050314,0000/

88,fab2,113781251,,V,050315,0000,fab3,113781251,,V,050316,0000/

88,fab4,113781251,,V,050317,0000,fab5,113781251,,V,050318,0000/

88,010,0,,,015,0,,,045,0,,,100,302982205,,,400,302982205,,/

16,169,57626223,V,050311,0000,102 0101857345,/

88,LLOYDS TSB BANK PL 779300 99129797

88,TRF/REF 6008ABS12300015439

88,102 0101857345 K BANK GIRO CREDIT

88,/IVD-11 MAR

49,1778372829,90/

98,1778372839,1,91/

99,1778372839,1,92
War es hilfreich?

Lösung

Ich würde empfehlen, Erstellen von Klassen (oder structs, oder was immer Wert geben Sie Ihre Sprache unterstützt), wie

record.ClientReference

ist so viel mehr beschreibend als

record[0]

und, wenn Sie mit den (wunderbar!) FileHelpers Bibliothek , dann sind Ihre Bedingungen ziemlich viel für Sie bestimmt.

Andere Tipps

Validierungslogik hat in der Regel mindestens zwei Ebene, die gröberen Ebene „gut formatiert“ und die feinere Ebene zu sein „richtige Daten“ zu werden.

Es gibt ein paar verschiedenen Probleme hier. Ein Problem ist, dass einfach die Daten zu überprüfen, oder das Schreiben von Tests, um sicherzustellen, dass Ihre Analyse korrekt ist. Ein einfacher Weg, dies zu tun ist, in eine Klasse zu analysieren, die einen bestimmten Bereich von Werten annehmen, und führt den entsprechenden Fehler, wenn nicht,    z.B.

public void setField1 (int i)    {         if (i> 100) throw new InvalidDataException ...    }

Erstellen von verschiedenen Klassen für jeden Datensatztyp ist etwas, was Sie wollen vielleicht tun, wenn die Parsing-Logik für verschiedene Codes signifikant verschieden ist, so dass Sie sich nicht bedingte Logik wie

   public void setField2(String s)
   {
         if (field1==88 && s.equals ...

         else if (field2==22 && s 
   }

yechh.

Wenn ich diese Art von Daten, die in der Vergangenheit zu laden gehabt haben, ich habe sie alle in einen Arbeitstisch mit den ersten beiden Zeichen in einem Feld und der Rest in einem anderen setzen. Dann habe ich es aus den entsprechenden anderen Arbeitstischen auf der Grundlage der ersten beiden Zeichen analysiert. Dann habe ich eine Bereinigung und Validierung durchgeführt, bevor die Daten aus dem zweiten Satz von Arbeitstischen in die Datenbank einfügen.

In SQL Server Sie dies durch eine DTS tun können (2000) oder ein SSIS-Paket und SSIS verwenden, können Sie in der Lage sein, die Daten onthe fly zu verarbeiten mit der Speicherung in Arbeitstischen ersten, aber die prcess ist smilar, verwenden Sie die erste zwei Zeichen des Datenfluß Zweig zu bestimmen, um dann mit dem Rest des Datensatz in irgendeine Art von Haltemechanismus parsen und dann reinigen und validieren vor dem einsetzen. Ich bin sicher, dass andere Datenbanken auch irgendeine Art von Mechanismus haben Daten für den Import und würden einen simliar Prozess verwendet werden.

Ich bin damit einverstanden, dass, wenn Ihr Datenformat, jede Art von Komplexität hat, sollten Sie eine Reihe von benutzerdefinierten Klassen erstellen, um die Daten zu analysieren und zu halten, führen die Validierung und tun andere geeignete Modell Aufgaben (zum Beispiel einen Menschen lesbare Beschreibung zurückkehren, obwohl einige würden argumentieren, wäre dies besser in eine separate Ansicht Klasse setzen). Dies würde wahrscheinlich eine gute Situation seines Erbe zu verwenden, in dem Sie eine Elternklasse haben (möglicherweise Zusammenfassung) definiert die Eigenschaften und Methoden, die für alle Arten von Datensatz, und jedes Kind Klasse dieser Methoden außer Kraft setzen kann ihr eigenes Parsing und Validierung bei Bedarf zur Verfügung zu stellen oder ihre eigenen Eigenschaften und Methoden hinzufügen.

eine Klasse für jede Art von Zeile Erstellen wäre eine bessere Lösung als Arrays verwendet wird.

Wie gesagt, aber in der Vergangenheit habe ich Arraylisten von Hashtables verwendet, um das Gleiche zu erreichen. Jedes Element in der Arraylist ist eine Reihe und jeder Eintrag in der Hash-Tabelle ist ein Schlüssel / Wert-Paar darstellt Spaltennamen und Zellenwert.

Warum nicht durch die Datenbank entwerfen, die die Daten enthalten wird, dann können Sie die Entität framwork verwenden die Klassen für Sie zu generieren.

hier ist eine verrückte Idee:

Wenn Sie in Perl gearbeitet haben, könnten Sie verwenden DBD :: CSV Daten aus Ihrer Flat-Datei zu lesen, sofern Sie ihm die richtigen Werte für Abscheider und EOL Zeichen geben. Sie würden dann Zeilen aus der Flat-Datei mit Hilfe von SQL-Anweisungen lesen; DBI werden sie in Standard-Perl-Datenstrukturen für Sie, und Sie können gerne was Validierungslogik Sie laufen. einmal jede Zeile alle Validierungstests geht, würden Sie in der Lage sein, es in die Zieldatenbank zu schreiben, mit DBD :: was auch immer.

-Steve

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top