[C#] Générer un type struct à la volée

Générer un type struct à la volée [C#] - C#/.NET managed - Programmation

Marsh Posté le 14-03-2005 à 18:10:35    

Salut.
 
Depuis quelques jours, je vois les gens dans l'entreprise où je travaille galèrer avec des fichiers plats issus de différents systèmes d'information, et réinventer la roue à chaque fichier.
 
J'ai dans l'idée de leur écrire une routine en C# permettant d'automatiser autant faire ce peu ces traîtements.
 
Pour ce faire, imaginons que je reçois un fichier :

Code :
  1. 58AEABCCDE005879
  2. 250AZERDEV004998


 
Après analyse (ou wizard), le programme déduit de ce fichier qu'on a :
in type INT(32), suivit d'un STRING(3), d'un autre STRING(3) suivit d'un STRING(6) répondant devant correspondre à un type numérique, et enfin d'un BYTE[2] contenant la constante 0A0D
 
Avec un STRUCT, je peux donc lire ce fichier, et le traîter simplement en mémoire.
 
Par contre, je ne peux pas créer d'avance un type struct différent par type de fichier possible. Donc, j'ai dans l'idée, après avoir collecté les informations des colonnes du fichier, de générer dynamiquement mon type, et m'en servir.
 
Toujours avec cette notion de dynamique, je veux ensuite pouvoir interroger mes variables ainsi créées, afin de les traîter.
 
En C, avec des pointeurs et des casts à gogo, ça doit facilement être jouable. Mais en C#, je n'ai aucune idée de comment faire.
 
Une idée ?

Reply

Marsh Posté le 14-03-2005 à 18:10:35   

Reply

Marsh Posté le 14-03-2005 à 22:00:02    

avec un struct je doue que tu puisses traiter ce fichier de facon efficace.  (d'un autre coté j'ai pas compris grand chose a ton exemple)

Reply

Marsh Posté le 15-03-2005 à 00:23:14    

Mon exemple n'est pas clair en effet, surtout qu'il est foireux :D
 
Bon, imagine que j'ai un fichier :
 

Code :
  1. CDE   123M Dupond        P
  2. DEV  1590André Schmol    X
  3. CDE   124Alfred          V


 
Après rapide analyse, on trouve la structure suivante au fichier :
 
Type ligne = 3 caractères
Numéro = 6 caractères
Nom client = 16 caractères
Statut = 1 caractère
Saut de ligne : 2 caractères (chr(10) + chr(13))
 
Ainsi, pour lire le fichier ligne par ligne de façon efficace, je vais créer une struct (désolé, j'ai pas en tête la syntaxe pour dimensionner une chaîne ni pour écrire une struct, j'utilise donc la syntace VB ;))
 

Code :
  1. struct line
  2.    typeLine as string * 3
  3.    numero as string * 6
  4.    nom as string * 16
  5.    statut as string * 1
  6.    endline as string * 2
  7. end struct


 
Ensuite, normalement, si le C# est un langage "normal", je peux lire directement le fichier, comme en VB, en faisant un (ou un truc du genre) :
 

Code :
  1. file.read(maStruct);


 
=> Ainsi, je lis la taille de la struct, et dans chaque élément de ma struct, j'ai la bonne valeur dedans. Deplus, le pointeur à l'intérieur du fichier a avancé extactement jusqu'à l'enregistrement suivant. En tant normal, c'est ce qu'il y a de plus rapide et de plus efficace pour lire/écrire dans un fichier, car tu te déplaces aisément à l'endroit exact de lecture/écriture, et en une seule instruction, tu lis tous les éléments d'un record.
Seul problème, c'est que si le programme ne sait pas à l'avance la structure à lire, ben c'est pas évidement de l'inventer :D
 
Mais en fait, j'ai réfléchis après avoir posté, et finalement, j'ai une solution simple :
 
Dans mon exemple, la struct fait : 3 + 6 + 16 + 1 + 2 = 28 caractères = 28 bytes.
J'ai donc juste qu'à déclarer un byte[28] et le lire. A priori, on peut déclarer simplement un tableau d'un taille dynamique, donc pas de problème.
Ensuite en stockant dans un coin (un autre tableau) la liste des champs, avec leur position et leur taille dans un autre tableau, il me sera relativement aisé de retrouver les bouts de tableau correspondants.
 
Donc en fait, à moins qu'il existe une solution plus propre, à condition qu'on puisse lire directement une struct dans un fichier en C# (y'a rien de moins sûr), je devrais pouvoir m'en sortir sans utiliser ma bidouille ;))


Message édité par Arjuna le 15-03-2005 à 00:25:42
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed