German Textdatei Zeichenweise einlesen

mw71

Active Member
Licensed User
Longtime User
Hallo zusammen,

wie schon im Titel geschrieben möchte ich gerne eine Textdatei Zeichenweise einlesen, hat da jemand eine Lösung/Beispiel?

Hintergrund ist folgender:
- die Datei enthält einen Header der mit <eoh> abgeschlossen ist, der kann ignoriert werden
- die Datenfelder beginnen immer mit (z.B.) <date:8>, wobei der erste Teil die Bezeichnung für das Feld ist, die Zahl die Länge
- abgeschlossen wird der Datensatz durch <eol>
- Problem ist, das 1 Datensatz nicht unbedingt in 1 Zeile ist, er kann auch in mehreren Zeilen sein oder alles hintereinander (ohne CLRF)

Zeichenweise zu Verarbeiten ist dann kein Problem (zumindest habe ich dafür schon ein Beispiel :) )

Danke schon mal
 

klaus

Expert
Licensed User
Longtime User
Versuche mit TextReader.ReadAll da solltest Du einen String erhalten der die ganze Datei enthält.
Dann kannst Du den String mit IndexOf und IndexOf2 durchsuchen.
 

DonManfred

Expert
Licensed User
Longtime User
File.ReadList liefert Dir eine liste mit allen zeilen. Wäre auch eine Alternative, wenn die Datei nicht zu gross ist.
 

mw71

Active Member
Licensed User
Longtime User
Hallo,

danke für die Infos.

TextReader.ReadAll...ich habe erst gedacht das ein String nur eine begrenzte Länge haben kann, aber so wie ich das gelesen habe gibt es zumindest kein "Hard Limit".
Ob die Hardware damit zurecht kommt ist eine andere frage (muss man wahrscheinlich mal testen). Durchsuchen würde ich das wahrscheinlich mit Substring in einer Schleife (so zumindest meine derzeitige Idee)

File.ReadList...Eine Beispieldatei hat ~50kB, kann aber auch mal mehr oder weniger sein. Wenn nach jedem Datensatz sauber CLRF gesetzt wird wäre das die optimale Lösung, aber das ist leider nicht vorgeschrieben und so macht das da jeder anders. o_O

Danke & Grüße
 

KMatle

Expert
Licensed User
Longtime User
Anscheinend enthält die Datei sog. "Tags". Hier ist es dann unerheblich, welche Zeile womit endet (im Sinne CR/LF), da du ja auf das Anfang/Ende-Tag zielst. Ist auch eine gute Programmierübung :). Das nennt man by the way "parsen" (für XML gibt es da eine nette Library).

Ich würde mir pro Header-Tag eine Variable anlegen. Diese dann immer setzen/löschen, wenn du ein Tag gefunden hast oder es beendet wird. Dann einfach abfragen und du weißt immer, wo du "bist" (Header = True -> so lange lesen bis Header = False, usw.). Das gleiche auch mit den Tags machen (TagGefunden = True oder False). So ne Art "Weiche", wohin das gerade gelesene Zeichen soll (entweder in die Tag-Variable oder in die des Wertes).
 

mw71

Active Member
Licensed User
Longtime User
Moin,

ja, über XmlSax Parser bin ich auch schon gestolpert, aber das XML Format ist da etwas "besser" da es ja u.a. auch einen End Tag gibt und jeder Datensatz als solcher eingegrenzt ist.

Ich hänge mal eine Beispieldatei an, das ist sicherlich sinnvoller/einfacher als wenn ich versuche das zu erklären.

B4X:
<programid:7>monolog
<USERDEF1:14:N>EPC
<USERDEF2:19:E>SweaterSize,{S,M,L}
<USERDEF3:15:N>ShoeSize,{5:20}

<EOH>

<qso_date:8>19900620
<time_on:4>1523
<call:5>VK9NS
<band:3>20M
<mode:4>RTTY
<sweatersize:1>M
<shoesize:2>11
<app_monolog_compression:3>off
<eor>

<qso_date:8>20101022
<time_on:4>0111
<call:5>ON4UN
<band:3>40M
<mode:3>PSK
<submode:5>PSK63
<epc:5>32123
<app_monolog_compression:3>off
<eor>

Mal schauen was mir die Suche unter Parsen noch Liefert, danach hab ich noch nicht gesucht.

Grüße
 
Top