Lire un enregistrement de largeur fixe à partir d’un fichier texte

J’ai un fichier texte plein d’enregistrements où chaque champ de chaque enregistrement a une largeur fixe. Ma première approche serait d’parsingr chaque enregistrement simplement en utilisant ssortingng.Subssortingng (). Y a-t-il un meilleur moyen?

Par exemple, le format pourrait être décrit comme suit:

 

Et un exemple de fichier avec deux enregistrements pourrait ressembler à ceci:

 SomeData0000000000123456SomeMoreData Data2 0000000000555555MoreData 

Je veux juste m’assurer que je ne néglige pas une manière plus élégante que Subssortingng ().


Mise à jour: je suis finalement allé avec une regex comme Killersponge a suggéré:

 private readonly Regex reLot = new Regex(REGEX_LOT, RegexOptions.Comstackd); const ssortingng REGEX_LOT = "^(?.{6})" + "(?.{16})" + "(?.{12})"; 

J’utilise ensuite les éléments suivants pour accéder aux champs:

 Match match = reLot.Match(record); ssortingng field1 = match.Groups["Field1"].Value; 

La sous-chaîne me convient bien. Le seul inconvénient auquel je peux immédiatement penser est que cela signifie que vous devez copier les données à chaque fois, mais je ne m’en soucierai pas tant que vous ne prouverez pas que c’est un goulot d’étranglement. La sous-chaîne est simple 🙂

Vous pouvez utiliser une expression rationnelle pour faire correspondre un enregistrement entier à la fois et capturer les champs, mais je pense que ce serait exagéré.

Utilisez FileHelpers .

Exemple:

 [FixedLengthRecord()] public class MyData { [FieldFixedLength(8)] public ssortingng someData; [FieldFixedLength(16)] public int SomeNumber; [FieldFixedLength(12)] [FieldTrim(TrimMode.Right)] public ssortingng someMoreData; } 

Ensuite, c’est aussi simple que cela:

 var engine = new FileHelperEngine(); // To Read Use: var res = engine.ReadFile("FileIn.txt"); // To Write Use: engine.WriteFile("FileOut.txt", res); 

Pourquoi réinventer la roue? Utilisez la classe TextFieldParser de .NET conformément à cette procédure pour Visual Basic .

Vous devrez peut-être faire attention, si la fin des lignes n’est pas complétée d’espaces pour remplir le champ, votre sous-chaîne ne fonctionnera pas sans un peu de bidouillage pour déterminer combien de lignes il rest à lire. Ceci ne s’applique bien entendu qu’au dernier champ 🙂

Non, la sous-chaîne va bien. C’est pour ça.

Malheureusement, le CLR n’est fourni qu’avec Subssortingng.

Quelqu’un de CodeProject a créé un parsingur syntaxique personnalisé en utilisant des atsortingbuts pour définir des champs . Vous voudrez peut-être examiner cela.

Vous pouvez configurer une source de données ODBC pour le fichier au format fixe, puis y accéder en tant que table de firebase database. Cela présente l’avantage supplémentaire que la connaissance spécifique du format de fichier n’est pas compilée dans votre code pour ce jour fatidique au cours duquel une personne décide de coller un champ supplémentaire au milieu.