10 Stimmen

Beste Methode für Textfile Parsing in C#?

Ich möchte eine Konfigurationsdatei analysieren, wie zum Beispiel so:

[KEY:Value]     
    [SUBKEY:SubValue]

Jetzt habe ich mit einer StreamReader Zeilen in Zeichenarrays umzuwandeln, als mir klar wurde, dass es einen besseren Weg geben muss. Also bitte ich Sie, bescheidener Leser, mir zu helfen.

Eine Einschränkung ist, dass es in einer Linux/Mono-Umgebung funktionieren muss (1.2.6 um genau zu sein). Ich habe nicht die neueste Version 2.0 (von Mono), also versuchen Sie, Sprachfunktionen auf C# 2.0 oder C# 1.0 zu beschränken.

0voto

Sie können auch einen Stack verwenden und einen Push/Pop-Algorithmus einsetzen. Dieser passt zu offenen/schließenden Tags.

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";
    }

Wahrscheinlich können Sie das so anpassen, dass Sie den Inhalt Ihrer Datei lesen können. Reguläre Ausdrücke sind auch eine gute Idee.

0voto

ICR Punkte 13528

@Gishu

Tatsächlich lief meine Regex etwas langsamer als mein handgeschriebener rekursiver Top-Down-Parser, und das ohne die Verschachtelung (Verknüpfung von Unterelementen mit ihren Eltern) und die Fehlerberichterstattung, die der handgeschriebene Parser hatte, nachdem ich die escaped characters berücksichtigt hatte.

Die Regex war etwas schneller zu schreiben (obwohl ich ein wenig Erfahrung mit Handparsern habe), aber das ist ohne gute Fehlermeldungen. Sobald Sie hinzufügen, dass es etwas schwieriger und länger zu tun wird.

Ich finde auch, dass der handgeschriebene Parser leichter zu verstehen ist, was er bezweckt. Hier ist zum Beispiel ein Ausschnitt des Codes:

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

-1voto

Gishu Punkte 130442

Unabhängig von dem persistierten Format wäre die Verwendung einer Regex die schnellste Art des Parsing. In Ruby würde es wahrscheinlich ein paar Zeilen Code sein.

\[KEY:(.*)\] 
\[SUBKEY:(.*)\]

Mit diesen beiden erhalten Sie den Wert und den Unterwert in der ersten Gruppe. Schauen Sie bei MSDN nach, wie man einen Regex mit einer Zeichenkette abgleicht.

Das ist etwas, das jeder in seinem Köfferchen haben sollte. Die Zeit vor Regex ist wie die Eiszeit.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X