Domanda

In sostanza, devo ottenere un file flat in un database. I file flat arrivano con i primi due caratteri su ogni riga che indicano che tipo di record è.

Creo una classe per ciascun tipo di record con proprietà corrispondenti ai campi nel record? Dovrei usare solo array?

Voglio caricare i dati in una sorta di struttura di dati prima di salvarli nel database in modo da poter utilizzare i test unitari per verificare che i dati siano stati caricati correttamente.

Ecco un esempio di ciò con cui devo lavorare (estratti conto bancari BAI2):

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
È stato utile?

Soluzione

Consiglio di creare classi (o strutture, o qualunque tipo di valore supporti la tua lingua), come

record.ClientReference

è molto più descrittivo di

record[0]

e, se stai usando la (meravigliosa!) Libreria FileHelpers , i tuoi termini sono piuttosto molto dettato per te.

Altri suggerimenti

La logica di convalida di solito ha almeno 2 livelli, il livello più grossolano è "ben formattato" e il livello più preciso è "dati corretti".

Ci sono alcuni problemi separati qui. Un problema è quello di verificare semplicemente i dati o scrivere test per assicurarsi che l'analisi sia accurata. Un modo semplice per farlo è analizzare una classe che accetta un determinato intervallo di valori e, in caso contrario, genera l'errore appropriato,    per esempio.

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

La creazione di classi diverse per ogni tipo di record è qualcosa che potresti voler fare se la logica di analisi è significativamente diversa per codici diversi, quindi non hai una logica condizionale come

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

         else if (field2==22 && s 
   }

yechh.

Quando ho dovuto caricare questo tipo di dati in passato, ho inserito tutto in una tabella di lavoro con i primi due caratteri in un campo e il resto in un altro. Quindi l'ho analizzato nelle altre tabelle di lavoro appropriate in base ai primi due caratteri. Poi ho fatto qualsiasi pulizia e validazione prima di inserire i dati dalla seconda serie di tabelle di lavoro nel database.

In SQL Server puoi farlo attraverso un DTS (2000) o un pacchetto SSIS e usando SSIS, potresti essere in grado di elaborare i dati al volo con l'archiviazione prima nelle tabelle di lavoro, ma il processo è piccolo, usa il primo due caratteri per determinare il ramo del flusso di dati da utilizzare, quindi analizzare il resto del record in un qualche tipo di meccanismo di mantenimento e quindi ripulire e convalidare prima di inserirlo. Sono sicuro che anche altri database hanno un qualche tipo di meccanismo per importare dati e utilizzerebbero un processo simliar.

Sono d'accordo che se il tuo formato di dati presenta qualche tipo di complessità, dovresti creare un insieme di classi personalizzate per analizzare e conservare i dati, eseguire la convalida ed eseguire altre attività del modello appropriate (ad esempio, restituire una descrizione leggibile, anche se alcuni sostengono che sarebbe meglio metterlo in una classe di vista separata). Questa sarebbe probabilmente una buona situazione per usare l'ereditarietà, in cui una classe genitore (possibilmente astratta) definisce le proprietà e i metodi comuni a tutti i tipi di record e ogni classe figlio può sovrascrivere questi metodi per fornire il proprio analisi e validazione se necessario o aggiungi proprietà e metodi propri.

La creazione di una classe per ogni tipo di riga sarebbe una soluzione migliore rispetto all'utilizzo di array.

Detto questo, tuttavia, in passato ho usato Arraylists of Hashtables per ottenere lo stesso risultato. Ogni elemento nella matrice è una riga e ogni voce nella tabella hash è una coppia chiave / valore che rappresenta il nome della colonna e il valore della cella.

Perché non iniziare progettando il database che conterrà i dati, quindi è possibile utilizzare la struttura dell'entità per generare le classi per te

ecco un'idea stravagante:

se lavorassi in Perl, potresti usare DBD :: CSV per leggere i dati dal tuo file flat, a condizione che tu abbia fornito i valori corretti per i caratteri separatore ed EOL. avresti quindi letto le righe dal file flat mediante istruzioni SQL; DBI li trasformerà in strutture di dati Perl standard per te e potrai eseguire qualsiasi logica di convalida ti piaccia. una volta che ogni riga supera tutti i test di validazione, sarai in grado di scriverlo nel database di destinazione usando DBD :: qualunque cosa.

-Steve

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top