Laden...

Textdatei Spaltenweise auslesen, obwohl Trennzeichen uneinheitlich verwendet werden

Erstellt von martinc90 vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.154 Views
M
martinc90 Themenstarter:in
7 Beiträge seit 2014
vor 9 Jahren
Textdatei Spaltenweise auslesen, obwohl Trennzeichen uneinheitlich verwendet werden

Hallo ich stehe ziemlich auf dem Schlauch und komme nicht vorran. Ich soll für ein Projekt in meinem Praxissemester eine Textdatei Spaltenweise auslesen. Nur ist diese total eigenartig formatiert und man darf sie nicht ändern.
Hier mal ein auszug aus der Textdatei:

' Codetraeger-    Laenge    Format   Dialog-     
' Variable   	  in Bytes	     Variable     

' Werkzeugdaten
    Item1	     32     ASCII    T1		' Bezeichner
    Item2	      4     BCD      T2		' Duplo
    Item3	      2     BCD      T4=(Tet1),T5=(Tet2),T6=(Tet3),T7=(Tet4)  
'                       WZ-Groesse:  links     rechts    oben      unten
    Item4	     32     ASCII    T8		' Platztyp        
    Item5	      2     BCD      T9    	' Status
    Item6	      2     BCD      T3 	' Anz. Schneiden
    Item7	      2     BCD      T10 	' Art der WZ-Uebrwachung
    Item8	      2     BCD      T11 	' Art der WZ-Suche
'                       Anwender - Wekzeugdaten	
	Item9         4     REAL	 A1		' OEM1 Anwender Werkzeugdaten
	Item10        4     REAL	 A2		' OEM2 Anwender Werkzeugdaten
	Item11        4     REAL	 A3		' OEM3 Anwender Werkzeugdaten
	Item12        4     REAL	 A4		' OEM4 Anwender Werkzeugdaten
	Item13        4     REAL	 A5		' OEM5 Anwender Werkzeugdaten
	Item14        4     REAL	 A6		' OEM6 Anwender Werkzeugdaten
	Item15        4     REAL	 A7		' OEM7 Anwender Werkzeugdaten
	Item16        4     REAL	 A8		' OEM8 Anwender Werkzeugdaten
	Item17        4     REAL	 A9		' OEM9 Anwender Werkzeugdaten
	Item18        4     REAL	 A10	' OEM10 Anwender Werkzeugdaten

Ich soll nun zB die Spalte DialogVariable und Bezeichner rauslesen.
Habt ihr eine Idee? Vielen Dank schon mal.

C
2.121 Beiträge seit 2010
vor 9 Jahren

Textdateien werden zeilenweise geschrieben. Man kann sie daher auch nur zeilenweise auslesen. Du musst also jede Zeile nehmen und daraus die einzelnen Spalten extrahieren.

M
martinc90 Themenstarter:in
7 Beiträge seit 2014
vor 9 Jahren

Ok und wie kann ich dann in den jeweiligen Zeilen vernünftig nach Spalten gliedern? Ich hab in dem Textdokument ja leider keine einheitlichen Trennzeichen. Sind mal Tabs und mal Leerzeichen.
Deshalb komm ich mit Split auch nicht weiter.

S
93 Beiträge seit 2008
vor 9 Jahren

Du kannst bei Split auch ein Array mit verschiedenen Trennzeichen übergeben.
Schau in der Dokumentation nach.

C
2.121 Beiträge seit 2010
vor 9 Jahren

Ich hab in dem Textdokument ja leider keine einheitlichen Trennzeichen. Sind mal Tabs und mal Leerzeichen.

Dann musst du dem eins auf die Kappe geben der die Datei erstellt hat. Den Aufbau der Datei mit all ihren Besonderheiten kennst du am besten, entsprechend diesem Aufbau musst du das auseinander nehmen. Das kann kein fertiger Code im Voraus wissen 😃

E
180 Beiträge seit 2010
vor 9 Jahren

split hilft dir hier nicht weiter leider. du kannst nur zeilenweise parsen und mit regex filtern. Ein Beispielhaftes Pattern wäre z.b.

\s*(Item[\d]*)\s*([\d]*)\s*([\w]*)\s*([\w\d=\(\)]*)\s*[']\s([\w\s.-]*\n)

allerdings musst du noch den spezialfall prüfen für "Item3 2 BCD T4=(Tet1),T5=(Tet2),T6=(Tet3),T7=(Tet4) ". Da dies natürlich ausm Rahmen fällt. Aber bisle was sollst ja auch tun 😃

1.361 Beiträge seit 2007
vor 9 Jahren

Hey,

wenn du String.Split mit null oder einem leeren Array aufrufst, werden alle Whitespace-Zeichen genommen.
Ich würde es also so hier probieren:


// strip comments
int comment_start = line.IndexOf('\'');
if(comment_start >= 0)
  line = line.Substring(0, comment_start);

// skip empty lines and lines with comments
if(line.IsNullOrWhiteSpace())
  continue; //oder return, oder was anderes...

string[] data = line.Split(null as char[], StringSplitOptions.RemoveEmptyEntries)

beste Grüße
zommi

M
martinc90 Themenstarter:in
7 Beiträge seit 2014
vor 9 Jahren

perfekt danke für eure Hilfe ich werds morgen gleich probieren und melde mich nochmal 😃