Question

Essentiellement, je dois obtenir un fichier plat dans une base de données. Les fichiers plats arrivent avec les deux premiers caractères sur chaque ligne indiquant le type d’enregistrement.

Est-ce que je crée une classe pour chaque type d'enregistrement avec des propriétés correspondant aux champs de l'enregistrement? Devrais-je simplement utiliser des tableaux?

Je souhaite charger les données dans une sorte de structure de données avant de les enregistrer dans la base de données afin de pouvoir utiliser des tests unitaires pour vérifier que les données ont été chargées correctement.

Voici un exemple de ce avec quoi je dois travailler (relevés bancaires 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
Était-ce utile?

La solution

Je vous recommande de créer des classes (ou des structures, ou le type de valeur que votre langage prend en charge), comme

.
record.ClientReference

est tellement plus descriptif que

record[0]

et, si vous utilisez la (merveilleuse!) bibliothèque FileHelpers , vos termes sont jolis beaucoup dicté pour vous.

Autres conseils

La logique de validation comporte généralement au moins deux niveaux, le niveau le plus élevé étant "bien formaté". et le niveau plus fin étant "données correctes".

Il y a quelques problèmes distincts ici. L'un des problèmes est simplement de vérifier les données ou d'écrire des tests pour vous assurer que votre analyse est précise. Une méthode simple consiste à analyser une classe qui accepte une plage de valeurs donnée et, le cas échéant, renvoie l'erreur appropriée.    par exemple.

public void setField1 (int i)    {         si (i> 100) jette une nouvelle exception InvalidDataException ...    }

La création de classes différentes pour chaque type d’enregistrement peut s’avérer utile si la logique d’analyse est très différente pour différents codes. Vous n’avez donc pas de logique conditionnelle telle que

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

         else if (field2==22 && s 
   }

yechh.

Lorsque j’ai dû charger ce type de données par le passé, j’ai tout placé dans une table de travail avec les deux premiers caractères dans un champ et le reste dans un autre. Ensuite, je l'ai analysé dans les autres tables de travail appropriées en fonction des deux premiers caractères. Ensuite, j'ai effectué le nettoyage et la validation avant d'insérer les données du deuxième ensemble de tables de travail dans la base de données.

Dans SQL Server, vous pouvez le faire via un package DTS (2000) ou SSIS et utiliser SSIS pour traiter les données à la volée tout en les enregistrant dans des tables de travail, mais le processus est smilar, utilisez le premier. deux caractères pour déterminer la branche de flux de données à utiliser, puis analyser le reste de l’enregistrement dans un type de mécanisme de conservation, puis nettoyer et valider avant l’insertion. Je suis sûr que d'autres bases de données disposent également d'un mécanisme permettant d'importer des données et utiliseraient un processus similaire.

Je conviens que si votre format de données présente une complexité quelconque, vous devez créer un ensemble de classes personnalisées pour analyser et conserver les données, effectuer une validation et effectuer toute autre tâche de modèle appropriée (par exemple, renvoyer une description lisible par l'homme, bien que certains avancent qu'il serait préférable de les placer dans une classe de vue séparée). Ce serait probablement une bonne situation pour utiliser l'héritage, où vous avez une classe parent (éventuellement abstraite) définissant les propriétés et les méthodes communes à tous les types d'enregistrements, et chaque classe enfant peut remplacer ces méthodes pour fournir leur propre analyse et validation si nécessaire. , ou ajoutez leurs propres propriétés et méthodes.

Créer une classe pour chaque type de ligne serait une meilleure solution que d’utiliser des tableaux.

Cela dit, j’ai utilisé dans le passé des arraylistes de hachtables pour accomplir la même chose. Chaque élément de la liste de contrôle est une ligne et chaque entrée de la table de hachage est une paire clé / valeur représentant le nom de la colonne et la valeur de la cellule.

Pourquoi ne pas commencer par concevoir la base de données qui contiendra les données, vous pourrez ensuite utiliser l'entité Framwork pour générer les classes à votre place.

voici une idée farfelue:

si vous travailliez dans Perl, vous pouvez utiliser DBD. :: CSV pour lire les données de votre fichier plat, à condition que vous lui ayez indiqué les valeurs correctes pour le séparateur et les caractères EOL. vous liriez ensuite des lignes du fichier plat au moyen d'instructions SQL; DBI les transformera en structures de données Perl standard et vous pourrez exécuter la logique de validation de votre choix. une fois que chaque ligne passe tous les tests de validation, vous pourrez l'écrire dans la base de données de destination à l'aide de DBD :: what.

-steve

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top