C# txt-Dateien auslesen: Zahlen parsen & reguläre Ausdrücke

Lucky Luke

Ensign
Registriert
März 2005
Beiträge
128
Grüße an die Gemeinde,

ich probiere mich gerade ein wenig mit C# aus und stehe gerade vor einem Problem. Ich möchte mit txt-Dateien arbeiten, diese einlesen und editieren. Diese Datei hat folgendes Layout:
Code:
#Kommentar
#Kommentar
#Kommentar
#Zahl1 <tab> Zahl2 <tab> Zahl3 <tab> Zahl4 ...
Zahl1 <tab> Zahl2 <tab> Zahl3 ...
#Zum Beispiel:
0001 <tab> 0.25 <tab> -1,75 <tab> +2,25 <tab> 5 ...
Mir ist es schon gelungen, die Kommentarzeilen mithilfe von regulären Ausdrücken zu erkennen:
Code:
Regex regex = new Regex(@"^\s*#");
Diese Notation erlaubt auch Kommentarzeilen, wo vor dem Rautezeichen eine oder mehrere Leerzeichen stehen.
Auf ähnliche Art und Weise möchte ich die in der Textdatei stehenden Zahlen parsen und intern an Variablen vergeben. Wie ihr seht sind die Zahlen tabstopp-getrennt. Das sollte in dem gesuchten regulären Ausdruck mit vermerkt sein. Eine weitere Schwierigkeit ist das Format der Zahlen. Die erste, vierte, sechste, neunte und elfte Zahl ist eine natürliche Zahl. Die restlichen sind Kommazahlen, wobei bei positiven Zahlen wahlweise das Voreichen davorsteht oder nicht. Es gibt eine Vorkommazahl und zwei Nachkommazahlen...

So, hoffe ihr könnt mir helfen und sagen, welcher regulärer Ausdruck von nöten ist und mit welchen Methodenaufrufen ich dem internen int-array die Zahlen aus der Textdatei zuweise.


Mfg Lucky
 
gibt es einen bestimmten Grund warum du Regex einsetzen willst?

du kannst die Datei zeilenweise auslesen und jede Zeile für sich bearbeiten:

Code:
List<double> values = new List<double>();
string[] entries = line.Trim().Split(new string[] { "\t" }, StringSplitOptions.RemoveEmptyEntries);
foreach(string entry in entries)
{
  double value;
  if(double.TryParse(entry,out value))
  {
     values.Add(value);
  }
}
double[] array = values.ToArray();
 
Hey versuche es mal damit:

Code:
Regex regex = new Regex(@"^\s*([\+\-]?[0-9]+([\,\.][0-9]+)?)(\t([\+\-]?[0-9]+([\,\.][0-9]+)?))+");
 
Ich gehe mal davon aus, dass du die txt selber erstellt hast.
Wieso benutzt du nicht eine Datenbank?

Wenn du die txt auch mit einem selbstgeschriebenen Programm erstellst und die einzelnen Werte irgendwelche Structs oder Objekte darstellen, dann kannst du sie gleich durch Serializierung abspeichern. Das erspart dir dann eine Menge Arbeit.
 
Hi Mephisto,
ist das nicht ein wenig übertrieben für die Aufgabe? Ich meine den Einsatz einer Datenbank. Desweiteren kenne ich genügend Programme / Geräte die einfach nur Textdateien ausspucken, die dann weiter verarbeitet werden sollen. Serializierung ist vielleicht eine Alternative, wenn man Zugriff auf die Codes des ausgebenden Programms hat. Wie würdest du das ganze serializieren? Binär oder über XML? Beides ist mir da ebenfalls zu viel des Guten. Das Parsen von Text ist beim Programmieren ubiquitär und läßt sich relativ einfach in jeder Sprache implementieren. Abgesehen davon das die Datei lesbar bleibt und ohne den Overhead von XML leicht bearbeitet werden kann.
Grüße
 
Serialisierung läuft nur über 5 Zeilen hin oder zurück.

ok, ich schaff das in 2 Zeilen! Spass beiseite. Man ist an das Format deiner so sehr geliebten Serialisierung gebunden, ob das dem Anwender dann hilft oder nicht. Also warum nicht etwas mehr Arbeit investieren, dabei ein paar Grundlagen lernen und unabhängig von Compiler, Sprache das Problem lösen können. Und ich glaube kaum, das du in der Lage bist ein bestimmtes fest definiertes Format in nur 5 Zeilen zu schreiben. Schließlich ist die Definition des Formats ebenfalls Bestandteil und wird gut und gerne mehr als 5 Zeilen beinhalten. Ebenso würden mich deine 5 Zeilen interessieren oder bist du nicht bereit diese zu posten? Fachbegriffe hin oder her, pack mal die Tatsachen auf den Tisch!
 
Ruf deinen Psychiater an und richte ihm folgendes aus:
"Entweder hat die Antiaggressionstherapie Ihres Patienten nichts gebracht, oder er ist genau so stur und unfähig wie Sie."

Ich weiß nicht wie du privat mit deinen Mitmenschen umgehst, aber so klappt das hier auf keinen Fall. Wenn du das gerade gelesen hast, weißt du, wie das bei anderen ankommt.
Wenn Serialisierung zu nutzlos wäre, dann würde es sie garnicht geben.

Ich hielt es nur für pädagogisch wertvoll mehrere Möglichkeiten aufzuzählen, über die dann im Nachhinein gerne auf seinen speziellen Nutzen diskutiert werden kann. Auf deine subjektive Bewertung und deine persönlichen Angriffe können sowohl ich, als auch der Threadersteller dankend verzichten.

So jetzt bin ich mal auf deine weiteren Sprüche gespannt, ich hol nur kurz schnell das Popcorn.
 
Zuletzt bearbeitet:
Mephisto: Zuerst - die 5 Zeilen Code für die Serialisierung würden mich sehr interessieren.

Desweiteren:

Ich hielt es nur für pädagogisch wertvoll mehrere Möglichkeiten aufzuzählen, über die dann im Nachhinein gerne auf seinen speziellen Nutzen diskutiert werden kann. Auf deine subjektive Bewertung und deine persönlichen Angriffe können sowohl ich, als auch der Threadersteller dankend verzichten.

Pädagogisch wertvoll ist es auch, sich mit Kritik auseinander zu setzen. Habe ich da etwa einen wunden Punkt bei dir getroffen?

Wenn Serialisierung zu nutzlos wäre, dann würde es sie garnicht geben.

In keinster Weise habe ich behauptet, das Serialisierung nutzlos wäre. Aber genauso wie es gute Gründe gibt Serializierung einzusetzen, gibt es auch gute Gründe dies nicht zu tun.
 
Zuletzt bearbeitet:
Nein.
Jeder normale Mensch würde sich natürlich angegriffen fühlen, aber das brauche ich dir ja nicht zu erzählen.
Und jetzt komm mal an mit deinen Gründen, "pack mal die Tatsachen auf den Tisch!"
 
Schade das du dich nicht dazu bewegen läßt ein paar wenige Zeilen Code zu posten. Aber sei es drum.

Hier zu den Gründen warum Serialisierung nicht immer die beste Wahl ist:

1. das Programm das den Output, sprich die Datei, erzeugt, liegt nur in Binärform vor und kann nicht geändert werden
2. das Programm das den Output einlesen soll, liegt nur in Binärform vor und kann nicht geändert werden
3. die Datei soll per Texteditor geändert und eingelesen werden können ohne vom Anwender gleich ein Crashkurs in XML einzufordern
4. die Datei soll per Texteditor geändert und eingelesen werden können (bei binärer Serialisierung nicht möglich!)
5. weiterer Overhead für das Parsen einer Datei erforderlich, da zusätzliche Informationen mit geliefert werden (meist wird dieses Parsen dann von Funktionen innerhalb der Umgebung erledigt, jedoch wird das neue Programm zusätzlich komplexer)

Aber das sind Gründe die ich bereits in den oberen Einträgen mehr oder weniger schrieb...
 
omg, wasn mit euch los? denke mal das Problem von Luke war nicht das Dateiformat sondern wie er die Daten verarbeiten kann.

@Rossibaer:
Anstatt Mephisto aufzuzeigen warum Serialisierung nicht sinnvoll ist, solltest du lieber Luke erklären warum der Einsatz von Regex für diese Aufgabe absolut übertrieben ist.

PS: Zum serialisieren braucht man nicht mehr als eine Zeile :P
 
haze4real:
Weiter oben wurden bereits mehrere Varianten genannt, wie man das parsen erledigen kann:

- Splitten: Es wird angenommen, das es sich um den Datentyp double handelt
- Regex: Hier ist keine Typkonvertierung, d.h. alles bleibt erstmal ein String und muss einzeln konvertiert werden in dem man sich z.B. durch die Match.Groups Auflistung loopt und da jeweils die Konvertierung analog zum Splitten (s.o.) erledigt.
- Serialisierung: Auslagerung der Strukturdefinition (weg vom Code hin zu Schemadatei, z.B. xsd), ggfs. Anpassung im Code mehrerer Programme notwendig
- Datenbank: zusätzlicher Installationsaufwand für das Programm (DBMS installieren), ggfs. Anpassung im Code mehrerer Programme notwendig

Wie im wahren Leben hat man nun die Wahl zwischen den verschiedenen Giftbechern. Alle Varianten führen zum Ziel. Grundsätzlich war jedoch die Frage, wie man das mit Regex machen kann. Wenn ich meine Meinung äußern darf, dann würde ich mit ein paar kleinen Änderungen die Split-Variante bevorzugen, wegen Geschwindigkeit, Übersichtlichkeit, Kontrolle...

Grüße
 
Zuletzt bearbeitet:
Zurück
Oben