[erledigt] Textbasierte Formate einlesen ala C++ iostreams?
-
Was verwendet man in C# üblicherweise um textbasierte Formate einzulesen?
Also Aufgaben wo man in C++ typischerweise iostreams verwendet.Die Möglichkeit alles in einen
string
zu lesen, diesen dann nach z.B. Leerzeichen zu splitten, und die einzelnen Teile dann mitConvert.Xyz
bzw.Type.Parse
zu parsen kenne ich.
(Und das man das auch Zeilenweise machen kann ist mir auch klar.)Aber gibt's auch irgend etwas womit man "direkt" aus einem
Stream
lesen kann?
z.B. für Fälle wo das Input-File einfach riesig ist.Natürlich kann man anfangen alles zu Fuss zu machen (einzelne Bytes lesen und in einem StringBuilder sammeln bis man auf ein Whitespace stösst, dann nen String draus machen und dann konvertieren), aber das kann's ja auch nicht wirklich sein, oder?
ps:
Wenn mir jemand sagen kann was "der übliche Weg" in C# ist wäre ich auch schon zufrieden, auch wenn es nichts bzw. kaum was mit C++ iostreams gemein hat.
-
Wirf mal einen Blick hier drauf
http://msdn.microsoft.com/de-de/library/system.io.streamreader.aspx
und die anderen Klassen in System.IO.Zeichenweise, zeilweise, blockweise usw. geht eigentlich alles, sowohl synchron als auch asynchron.
Was am schnellsten ist, hängt bei großen Dateien sicher auch etwas von der Hardware ab (Blockgröße).
-
Hallo hustbaer,
einen Standardweg wie bei C++ mit den IO-Operatoren bzw. mittels Boost.Spirit gibt es nicht direkt (außer das von dir beschriebene von-Hand-parsen einzelner Zeilen).
Es gibt aber eine Reihe von Utilities bzw. Libs (je nach Anforderung) dafür:
http://filehelpers.sourceforge.net
http://www.blackbeltcoder.com/Articles/strings/a-text-parsing-helper-class
http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.aspx
http://www.codeproject.com/Articles/30075/LINQ-to-Text-or-CSV-Files-Part-1Für weniger einheitlich strukturierte Textdateien (wie CSV o.ä.) wird meistens der Parser-Generator ANTLR empfohlen (habe ich selber aber auch noch nicht benutzt).
Als Beispiel noch der Link zum Parsen der C#-Grammatik selbst: http://antlrcsharp.codeplex.comOder aber selber einen Parser schreiben, wie z.B. meinen Parser für mathematische Formeln
-
Das verlinkte Beispiel von Codeproject zeigt zumindest ein in C# übliches Pattern, nämlich mit einem Enumerator über den StreamReader zu laufen.
Wenn die Eingabedateien aber wirklich riesig sind, könnte es besser sein, statt wie dort gezeigt, einzelne Strings zu lesen und in Stringarray zu splitten, mit den StreamReader Funktionen zu arbeiten, die Char[] liefern und dort bis zum nächsten Trennzeichen vorwärts zu laufen.
-
OK, danke, das hilft mir schonmal weiter
Ich hab' auch keinen konkreten Anwendungsfall, mich hat einfach nur interessiert wie das in C# üblicherweise gemacht wird.
Den Tip mit dem Enumerator finde ich gut. Das sollte ein brauchbarer Mittelweg sein, wenn man grosse Files bearbeiten muss, aber nicht unbedingt wild auf Performance optimieren will/muss.