28 votes

Comment analyser un fichier texte en C# ?

Par mise en forme du texte, je voulais dire quelque chose de plus compliqué.

Au début, j'ai commencé à ajouter manuellement les 5000 lignes du fichier texte pour lequel je pose cette question, dans mon projet.

Le fichier texte comporte 5000 lignes de longueur différente, par exemple :

1   1   ITEM_ETC_GOLD_01    ()   xxx xxx xxx_TT_DESC 0   0   3   3   5   0   180000  3   0   1   0   0   255 1   1   0   0   0   0   0   0   0   0   0   0   -1  0   -1  0   -1  0   -1  0   -1  0   0   0   0   0   0   0   100 0   0   0   xxx item\etc\drop_ch_money_small.bsr    xxx xxx xxx 0   2   0   0   1   0   0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0   0   0   0   0   0   0   0   0   0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1     (param1) -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx 0   0

1   4   ITEM_ETC_HP_POTION_01   HP      xxx SN_ITEM_ETC_HP_POTION_01    SN_ITEM_ETC_HP_POTION_01_TT_DESC    0   0   3   3   1   1   180000  3   0   1   1   1   255 3   1   0   0   1   0   60  0   0   0   1   21  -1  0   -1  0   -1  0   -1  0   -1  0   0   0   0   0   0   0   100 0   0   0   xxx item\etc\drop_ch_bag.bsr    item\etc\hp_potion_01.ddj   xxx xxx 50  2   0   0   1   0   0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0   0   0   0   0   0   0   0   0   0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120 HP   0   HP(%)    0   MP   0   MP(%)    -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx 0   0

1   5   ITEM_ETC_HP_POTION_02   HP  ()  xxx SN_ITEM_ETC_HP_POTION_02    SN_ITEM_ETC_HP_POTION_02_TT_DESC    0   0   3   3   1   1   180000  3   0   1   1   1   255 3   1   0   0   1   0   110 0   0   0   2   39  -1  0   -1  0   -1  0   -1  0   -1  0   0   0   0   0   0   0   100 0   0   0   xxx item\etc\drop_ch_bag.bsr    item\etc\hp_potion_02.ddj   xxx xxx 50  2   0   0   2   0   0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0   0   0   0   0   0   0   0   0   0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 220 HP   0   HP(%)    0   MP   0   MP(%)    -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx -1  xxx 0   0

Le texte entre le premier caractère (1) et le deuxième caractère (1/4/5) n'est pas un espace, c'est une tabulation. Il n'y a pas d'espace dans ce fichier texte.

Ce que je veux :

Je veux obtenir le second nombre entier (dans les trois lignes que j'ai postées ci-dessus, les seconds nombres entiers sont 1, 4 et 5) et la chaîne au milieu de chaque ligne indiquant le chemin (elle commence par "item\" et se termine par l'extension du fichier ".ddj").

Mon problème :

Je ne sais pas comment rechercher du texte à l'intérieur d'un fichier texte. Je ne peux pas non plus rechercher le premier nombre entier, car s'il s'agit d'un petit nombre entier comme dans les trois lignes que j'ai postées ci-dessus, je ne pourrai pas trouver l'emplacement correct, car par exemple "1" pourrait exister à un autre endroit.

Ma question :

Ce serait le mieux si j'écrivais un programme qui efface tout, sauf ce dont j'ai besoin.

L'autre moyen auquel je pense est de chercher directement dans ce fichier, mais comme je l'ai mentionné plus haut, je risque d'obtenir le mauvais emplacement du deuxième entier s'il est trop bas.

S'il vous plaît, proposez quelque chose, je ne peux pas formater tout ça à la main.

0voto

Ash Points 17

Essayez les expressions régulières. Vous pouvez trouver un certain modèle dans votre texte et le remplacer par quelque chose que vous voulez. Je ne peux pas vous donner le code exact pour le moment mais vous pouvez tester vos expressions en utilisant ceci.

http://www.radsoftware.com.au/regexdesigner/

0voto

Justin Ethier Points 57486

Vous pourriez ouvrir le fichier et utiliser StreamReader.ReadLine pour lire le fichier ligne par ligne. Ensuite, vous pouvez utiliser String.Split pour diviser chaque ligne en morceaux (utilisez une balise \t délimiteur) pour extraire le deuxième nombre.

Comme le nombre d'éléments est différent, vous devez rechercher le motif "item\*.ddj" dans la chaîne.

Pour supprimer un élément, vous pouvez (par exemple) conserver tout le contenu du fichier en mémoire et écrire un nouveau fichier lorsque l'utilisateur clique sur "Enregistrer".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X