2010-12-09 43 views
1

J'ai obtenu un fichier plat où les données ne sont pas délimitées ou autre chose. Le fichier contient une grande chaîne et une ligne est représentée par 180 caractères.créer un objet avec ses valeurs de propriété à partir d'un fichier plat, besoin d'idées d'implémentation

Chaque valeur de colonne est définie par une longueur de caractères. Je dois créer un objet pour chaque ligne, analyser les 180 caractères et remplir les propriétés de l'objet créé avec les valeurs analysées. Comment puis-je résoudre ce problème sans utiliser de sous-chaîne ou autre chose de façon permanente?

Peut-être une bonne solution avec Linq?

Merci beaucoup.

Répondre

1

Solution 1 - Super rapide mais dangereux:

  • Créer votre classe avec [StructLayout(LayoutKind.Sequential)] et toutes les autres marques de code non managé pour la longueur. Vos chaînes seront char array mais peuvent être exposées en tant que chaîne après le chargement.
  • Lire 180 octets et créer un tableau d'octets de la même taille dans un fixed bloc
  • Modifier pointeur sur IntPtr et utiliser Marshal.PtrToStructure() pour charger un onject de votre classe

Solution 2 - logique de chargement dans le classe:

  • Créer un constructeur dans votre classe qui accepte byte[] et à l'intérieur des objets à l'aide Covenrt.Toxxx ou Encoding.ASCII.ToString() en supposant qu'il est ASCII
  • Lire 180 octets et créer un objet et le transmettre à .ctor
  • Si vous devez serialise revenir à byte[] mettre en œuvre ensuite une méthode ToByteArray() et utiliser à nouveau Covenrt.Toxxx ou Encoding.ASCII.ToString() d'écrire à l'octet.

Amélioration des solutions 2:

Créer des attributs personnalisés et décorer vos classes avec ceux afin que vous puissiez avoir une usine qui lit les métadonnées et vos objets à l'aide gonfle tableau d'octets pour vous. Ceci est très utile si vous avez plus de deux classes de ce type.

Alternative aux solutions 2:

Vous pouvez passer d'un cours d'eau au lieu tableau d'octets qui est plus rapide.Ici vous utiliseriez BinaryReader et BinaryWriter pour lire et écrire des valeurs. Les cordes est cependant un peu un truc car il écrit aussi la longueur je pense.

0

Utilisez un StringReader pour analyser votre texte, vous n'aurez donc pas besoin d'utiliser la sous-chaîne. Linq ne vous aidera pas ici.

0

Je suis d'accord avec OJ mais même avec StringReader vous aurez toujours besoin de la position de chaque valeur pour l'analyser hors de la chaîne ... il n'y a rien de mal avec la sous-chaîne assurez-vous d'utiliser des constantes statiques longueurs de fin. Exemple:

private static int VAR_START_INDEX = 0; 
private static int VAR_END_INDEX = 4; 

String data = "thisisthedata"; 

String var = data.Substring(VAR_START_INDEX,VAR_END_INDEX); 
//var would then be equal to 'this' 
+0

VAR_END_INDEX devrait vraiment être appelé VAR_LENGTH – juharr