1 votes

Analyse d'un fichier texte complexe avec C#

Je dois analyser un fichier texte contenant un grand nombre de niveaux et de caractères. J'ai essayé différentes manières de l'analyser mais je n'ai pas réussi à faire fonctionner quoi que ce soit. J'ai inclus un échantillon du fichier texte que j'utilise. Avez-vous des suggestions sur la façon dont je peux analyser ce fichier ?

J'ai indiqué les parties du fichier dont j'ai besoin avec TEXTINEED.

(bean name:
       'TEXTINEED
       context:
       (list '/text
             '/content/home/left-nav/text
             '/content/home/landing-page)
       type:
       '/text/types/text
       module:
       '/modules/TEXTINEED
       source:
       '|moretext|
       ((contents
          (list (list (bean type:
                             '/directory/TEXTINEED
                             ((directives
                                (bean ((chartSize (list 600 400))
                                        (showCorners (list #f))
                                        (showColHeader (list #f))
                                        (showRowHeader (list #f)))))))
                      (bean type:
                             '/directory/TEXTINEED
                             ((directives
                                (bean ((displayName (list "MTD"))
                                        (showCorners (list #f))
                                        (showColHeader (list #f))
                                        (showRowLabels (list #f))
                                        (hideDetailedLink (list #t))
                                        (showRowHeader (list #f))
                                        (chartSize (list 600 400)))))))
                      (bean type:
                             '/directory/TEXTINEED
                             ((directives
                                (bean ((displayName (list "QTD"))
                                        (showCorners (list #f))
                                        (showColHeader (list #f))
                                        (showRowLabels (list #f))
                                        (hideDetailedLink (list #t))
                                        (showRowHeader (list #f))
                                        (chartSize (list 600 400))))))))

2voto

luke Points 6688

Il semble que vous soyez tombé sur une belle S-Expression également connu sous le nom de LISP code. Il semble complexe, mais il est en fait assez facile à analyser. En fait, si vous voulez apprendre beaucoup de choses sur Lisp, vous pouvez suivre les instructions suivantes articles de blog Une petite partie de ce travail consiste à écrire un analyseur syntaxique pour les fichiers de ce type. Mais c'est probablement trop pour vous :)

Au lieu de cela, vous devriez utiliser un analyseur S-Expression déjà disponible, voici un projet qui possède un analyseur S-Expression. interprète lisp pour .NET, vous devriez pouvoir utiliser leur code ou leur projet pour analyser le fichier.

La chose la plus simple à faire serait de lire le fichier comme un programme Lisp, donc au lieu de l'analyser, vous l'exécuteriez simplement. Une autre option serait donc d'écrire un petit programme lisp pour transformer le fichier en quelque chose d'un peu plus naturel en C# (peut-être XML ?).

Pour référence, voici un autre post qui parle de lisp en C#

EDITAR

aquí est un interpréteur de schéma écrit en c (il n'a qu'environ 1000 loc), vous êtes intéressé par la partie read et les procédures associées. Cette méthode utilise une analyse très simple d'une expression en un arbre de structures C. Vous devriez pouvoir l'adapter en C# sans problème.

0voto

TreDubZedd Points 2070

Vous pouvez envisager d'écrire une machine à états qui change d'état en fonction des différents jetons que vous rencontrez dans le fichier. J'ai constaté que les analyseurs syntaxiques basés sur les états sont assez faciles à écrire et à déboguer. La partie la plus difficile serait probablement de définir les jetons que vous utilisez.

0voto

nikie Points 7479

Utiliser un générateur d'analyseur syntaxique comme ANTLR. Il prend une description de type EBNF de la grammaire et crée un code d'analyseur dans le langage de votre choix.

0voto

Jonathan Wood Points 26443

Une approche consiste à commencer par une aide à l'analyse syntaxique telle que celle décrite à l'adresse suivante http://www.blackbeltcoder.com/Articles/strings/a-text-parsing-helper-class . Le fichier est ensuite traité caractère par caractère. C'est ce que j'ai fait pour plusieurs classes.

0voto

sw. Points 1927

J'ai écrit un analyseur de S-Expression pour C# en utilisant OMeta#. Il est disponible à l'adresse https://github.com/databigbang/SExpression.NET

En regardant votre variante de S-Expression, il vous suffit de changer ma définition de chaîne avec des guillemets doubles d'ouverture et de fin en guillemets simples et d'ajouter la définition pour les éléments qui contiennent un deux-points à la fin (je suppose qu'il s'agit de dictionnaires).

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