txt - streamreader readline c#




Meilleure méthode d'analyse de fichier texte en C#? (6)

Je l'ai considéré, mais je ne vais pas utiliser XML. Je vais écrire ces trucs à la main, et l'édition manuelle XML me fait mal au cerveau. : ')

Avez-vous regardé YAML ?

Vous obtenez les avantages de XML sans toute la douleur et la souffrance. Il est largement utilisé dans la communauté ruby ​​pour des choses comme les fichiers de configuration, les données de base de données pré-préparées, etc.

voici un exemple

customer:
  name: Orion
  age: 26
  addresses:
    - type: Work
      number: 12
      street: Bob Street
    - type: Home
      number: 15
      street: Secret Road

Il semble y avoir une bibliothèque C # ici , que je n'ai pas utilisée personnellement, mais yaml est assez simple, alors "comment peut-il être difficile?" :-)

Je dirais qu'il est préférable d'inventer votre propre format ad-hoc (et de traiter les bugs de l'analyseur)

Je veux analyser un truc de fichier de configuration, comme ceci:

[KEY:Value]     
    [SUBKEY:SubValue]

Maintenant, j'ai commencé avec un StreamReader , convertissant des lignes en tableaux de caractères, quand j'ai pensé qu'il devait y avoir un meilleur moyen. Je vous demande donc, humble lecteur, de m'aider.

Une restriction est qu'il doit fonctionner dans un environnement Linux / Mono (1.2.6 pour être exact). Je n'ai pas la dernière version 2.0 (de Mono), alors essayez de restreindre les fonctionnalités de langage à C # 2.0 ou C # 1.0.


Il me semble que vous feriez mieux d'utiliser un fichier de configuration basé sur XML car il existe déjà des classes .NET qui peuvent lire et stocker les informations pour vous relativement facilement. Y a-t-il une raison pour que ce ne soit pas possible?

@Bernard: Il est vrai que l'édition manuelle de XML est fastidieuse, mais la structure que vous présentez ressemble déjà beaucoup à XML.

Alors oui, a une bonne méthode là.


Vous pouvez également utiliser une pile et utiliser un algorithme push / pop. Celui-ci correspond aux tags ouverts / fermants.

public string check()
    {
        ArrayList tags = getTags();


        int stackSize = tags.Count;

        Stack stack = new Stack(stackSize);

        foreach (string tag in tags)
        {
            if (!tag.Contains('/'))
            {
                stack.push(tag);
            }
            else
            {
                if (!stack.isEmpty())
                {
                    string startTag = stack.pop();
                    startTag = startTag.Substring(1, startTag.Length - 1);
                    string endTag = tag.Substring(2, tag.Length - 2);
                    if (!startTag.Equals(endTag))
                    {
                        return "Fout: geen matchende eindtag";
                    }
                }
                else
                {
                    return "Fout: geen matchende openeningstag";
                }
            }
        }

        if (!stack.isEmpty())
        {
            return "Fout: geen matchende eindtag";
        }            
        return "Xml is valid";
    }

Vous pouvez probablement adapter afin que vous puissiez lire le contenu de votre fichier. Les expressions régulières sont également une bonne idée.


@Gishu

En fait, une fois que je m'étais arrangé pour les caractères échappés, mon regex fonctionnait légèrement plus lentement que ma main écrite en bas de l'analyseur récursif et sans l'imbrication (reliant les sous-éléments à leurs parents) et l'erreur.

L'expression régulière était un peu plus rapide à écrire (bien que j'ai un peu d'expérience avec les parseurs à main), mais c'est sans un bon rapport d'erreurs. Une fois que vous ajoutez que cela devient un peu plus difficile et plus long à faire.

Je trouve également l'analyseur écrit à la main plus facile à comprendre l'intention de. Par exemple, voici un extrait du code:

private static Node ParseNode(TextReader reader)
{
    Node node = new Node();
    int indentation = ParseWhitespace(reader);
    Expect(reader, '[');
    node.Key = ParseTerminatedString(reader, ':');
    node.Value = ParseTerminatedString(reader, ']');
}

Il existe une autre bibliothèque YAML pour .NET qui est en cours de développement. À l'heure actuelle, il prend en charge la lecture des flux YAML et a été testé sur Windows et Mono. Le support en écriture est en cours de mise en œuvre.


L'utilisation d'une bibliothèque consiste presque toujours à rouler la vôtre. Voici une liste rapide de "Oh, je n'aurai jamais besoin de ça / je n'y ai pas pensé" points qui finiront par venir vous mordre plus tard:

  • Évasion des personnages. Que faire si vous voulez un: dans la clé ou dans la valeur?
  • Échapper au caractère d'échappement.
  • Unicode
  • Mélange d'onglets et d'espaces (voir les problèmes avec la syntaxe sensible à l'espace blanc de Python)
  • Gestion de différents formats de caractères de retour
  • Gestion des rapports d'erreur de syntaxe

Comme d'autres l'ont suggéré, YAML ressemble à votre meilleur pari.





fileparse