Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1321 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1012400
Arjuna
Aircraft Ident.: F-MBSD
Posté le 14-03-2005 à 18:10:35  profilanswer
 

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 ?

mood
Publicité
Posté le 14-03-2005 à 18:10:35  profilanswer
 

n°1012604
chrisbk
-
Posté le 14-03-2005 à 22:00:02  profilanswer
 

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)

n°1012834
Arjuna
Aircraft Ident.: F-MBSD
Posté le 15-03-2005 à 00:23:14  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 

Sujets relatifs
Modifier le type d'un champ sur une base de productionGénérer des data form HTML a partir d'un XML ou d'un XSD
[Java] Reconnaissance de typeType pour un champ
Aller a la ligne dans mon XSL sans generer de retour chariot ?effacer type file en javascript
Quel type utiliser ?Quel type transfert choisir SSH FTP HTTP ??
chemin par defaut dans un input type filelien du type "mapage.php3?id=2"
Plus de sujets relatifs à : [C#] Générer un type struct à la volée


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR