Autor Beitrag
Micha_S
Hält's aus hier
Beiträge: 8

Windows XP Home SP2
C#
BeitragVerfasst: Fr 03.03.06 22:22 
Hallo zusammen,

beschäftige mich erst seit ein paar Tagen mit C# und bin auf dieses tolle Forum gestossen.

Zu Beginn möchte ich mich mit dem Auslesen und Schreiben von Textdateien beschäftigen, da ich dieses in meinem Job gut gebrauchen kann. Habe auch schon die "Standardbeispiel" zum Lesen und Schreiben von Texten in eine Datei durchgearbeitet, stosse aber bei der folgenden Aufgabe bereits an Grenzen (vielleicht hat jemand noch einen guten Buchtyp für mich?).

Meine Frage: Ich habe mehrere Textdateien mit Messprotokollen (Textfiles) in einem Verzeichnis, aus denen ich bestimmte Informationen auslesen und in einer Ergebnisdatei zusammen fassen möchte.



Beispiel Protokolle:

Messprotokoll_01.txt:
Datum=01.02.2006 Maschine=Bosch 1
Werk=5 Prüfer=Schulze
Der Text hier interessiert nicht
Länge=100.00
Breite=200.00

Messprotokoll_02.txt:
Datum=02.02.2006 Maschine=Bosch 2
Werk=6 Prüfer=Meier
Der Text hier interessiert nicht
Länge=105.00
Breite=205.00

Daraus soll werden (die Informationen zu Prüfer sowie der Hinweistext soll nicht berücksichtigt werden):

Ergebnis.txt
01.02.2006;Bosch 1;5;100.00;200.00
02.02.2006;Bosch 2;7;105.00;205.00

Stellen sich für mich als Anfänger natürlich eine Menge Fragen, u.a.:
- wie kann ich das Verzeichnis "abarbeiten"?
- wie finde ich die gewünschten Schlüsselfelder und lese die dazugehörigen Werte aus?

Kann mir jemand ein paar Tipps geben, in welche Richtung der Code gehen sollte?

Vielen Dank für Eure Aufmerksamkeit und Hilfe

Micha

Moderiert von user profile iconChristian S.: Titel geändert.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 03.03.06 22:41 
Hallo und :welcome:!

Du kannst mittels Directory.GetFiles(aDir) die Dateien eines Verzeichnis abfragen. Mit einer foreach-Schleife kannst Du dann durch das Ergebnis laufen und somit jede Datei "erwischen". Eine Datei einlesen kannst Du mittels der StreamReader-Klasse.

Nun zum Auslesen der Infos. Es dürfte reichen, mittels der String-Methoden IndexOf und SubString die entsprechenden Stellen in den einzelnen Zeilen zu lokalisieren und rauszukopieren.

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Micha_S Threadstarter
Hält's aus hier
Beiträge: 8

Windows XP Home SP2
C#
BeitragVerfasst: Sa 04.03.06 00:49 
Hallo Christian,

danke für Deine schnelle Antwort, ging ja superfix.

Danke auch für die Hinweise, da werde ich mal die Hilfe bemühen, mit IndexOf habe ich schon mal gespielt, SubString kenne ich noch nicht.

Mache mich morgen mal dran, ist jetzt ein bisserl spät :-)

Ach ja, vielleicht noch eine kleine Frage, hat nichts unmittelbar mit der Ausgangsfrage zu tun.

Wieder eine Textdatei, in der ich Daten (Rechnungsnr.) mit einer laufenden Nummer schreibe, z.B.

R0001;200
R0002;250

u.s.w.

Wie kann ich nun gezielt die letzte Zeile anspringen um die letzte Rechnungsnr. auszulesen und diese fortzuschreiben?

Nochmals vielen Dank für die Unterstützung und Gruss aus dem völlig eingeschneiten Mainz

Micha
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 04.03.06 00:53 
Hallo!

Bitte erstelle doch für die neue Frage ein neues Topic. Zum einen gibt es dann kein Durcheinander in diesem Topic (Wer antwortet gerade auf was?), zum anderen finde Nutzer mit demselben Problem die Lösung dann besser.

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Micha_S Threadstarter
Hält's aus hier
Beiträge: 8

Windows XP Home SP2
C#
BeitragVerfasst: Sa 04.03.06 08:37 
Hallo Christian,

habe ein neues Topic erstellt:

Rechnungsnummer aus Textdatei einlesen und fortschreiben

Vielen Dank und Gruß

Micha
Micha_S Threadstarter
Hält's aus hier
Beiträge: 8

Windows XP Home SP2
C#
BeitragVerfasst: Sa 04.03.06 23:35 
Also ich komme mit der ursprünglichen Aufgabe nicht weiter...

Wenn ich das Beispiel aus der Onlinehilfe mal wie folgt umbaue...

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
public static void Main()
        {

            string br1 = "0----+----1----+----2-";
            string br2 = "0123456789012345678901234567890";
            string str = "Werk=5 Prüfer=Schulze";
            
            string Suche = "Werk=";
            string SucheLeer = " ";
            string Ergebnis;
            int Laenge;
            int PositionString;
            int PositionStringLeer;

            Laenge = Suche.Length;
            PositionString = 0;
            PositionStringLeer = 0;

            Console.WriteLine();
            Console.WriteLine("{1}{0}{2}{0}{3}{0}", Environment.NewLine, br1, br2, str);
            
            PositionString = str.IndexOf(Suche);
            PositionStringLeer = str.IndexOf(SucheLeer, PositionString);
            Console.Write("{0} ", PositionString);

            Console.Write("Die Nummer lautet: ");

            Ergebnis = str.Substring(PositionString + Laenge, PositionStringLeer - (PositionString + Laenge));
            Console.Write("{0} ", Ergebnis);
            Console.WriteLine();
        }


bekomme ich das gewünschte Ergebnis.

Wenn ich nun versuche, das beim Auslesen der Datei umzusetzen:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
       static void Main(string[] args)
        {
            try
            {
                using (StreamReader sr = new StreamReader(@"F:\Messprotokoll_01.txt"))
                {
                    String str;
                    
                    // Lese Zeilen bis das Ende der Datei erreicht ist
                    while ((str = sr.ReadLine()) != null)
                    {
                            
                            string Suche = "Werk=";
                            string SucheLeer = " ";
                            string Ergebnis;
                            
                            int Laenge;
                            int PositionString;
                            int PositionStringLeer;

                            Laenge = Suche.Length;

                            PositionString = 0;
                            PositionStringLeer = 0;
                            
                            // Suche nach "Werk="
                            PositionString = str.IndexOf(Suche);
                            // Suche nach erstem Leerzeichen, beginnend nach Auffinden von "Werk="    
                            PositionStringLeer = str.IndexOf(SucheLeer, PositionString); 
                            
                            Console.Write("{0} ", PositionStringLeer);

                            Console.Write("Die Werksnummer lautet: ");

                            Ergebnis = str.Substring(PositionString + Laenge, PositionStringLeer - (PositionString + Laenge));
                            Console.Write("{0} ", Ergebnis);
                            Console.WriteLine();
                                        }
                                        
                                    }
                                }
            
            catch (Exception e)
            {
                // Let the user know what went wrong.
                Console.WriteLine("The file could not be read:");
                Console.WriteLine(e.Message);
            }
        }

bekomme ich eine Fehlermeldung:

The file could not be read:
Der Index liegt außerhalb des Bereichs. Er muss nicht negativ oder kleiner als die
Auflistung sein.
Parametername: startindex

Verstehe ich nicht. Der Fehler scheint wohl bei der Zeile

ausblenden C#-Quelltext
1:
PositionStringLeer = str.IndexOf(SucheLeer, PositionString);					


zu liegen (hier wird der Startindex angegeben), aber warum?

Gruss
Micha

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 04.03.06 23:52 
Hm. Im Moment kann ich nicht sehen, welcher Unterschied zwischen den beiden Codes diesen Fehler (vor allem an dieser Stelle) verursachen könnte.

Hast Du mal 'nen Haltepunkt gesetzt und bist dann die einzelnen Zeilen durchgegangen?

Evtl. könntest Du auch mal eine Beispiel-Protokoll-Datei anhängen, dann kann ich den Code mal testen.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Micha_S Threadstarter
Hält's aus hier
Beiträge: 8

Windows XP Home SP2
C#
BeitragVerfasst: So 05.03.06 01:54 
Danke Christian,

auch für das Hinzufügen der C#-Tags.

In der Anlage die Datei.

Ich habe mal Deinen Rat befolgt und mal einen Haltepunkt gesetzt. Wahrscheinlich liegt das Problem darin, dass mein Code die erste Zeile einliest (in der befindet sich der Suchstring eben noch nicht), und entsprechend für die Variable PositionString ein -1 setzt. Wenn nun in der folgenden Anweisung der IndexOf mit einem Startwert von -1 gefüttert wird, bricht wohl das Programm mit der Fehlermeldung ab.

Wäre das evtl. eine Erklärung?

Wie müsste denn die Anweisung lauten, wenn der Suchstring in der Zeile nicht gefunden wird, und das Programm in der nächsten Zeile weitersuchen soll?

Gruss
Micha
Einloggen, um Attachments anzusehen!
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 05.03.06 12:09 
Hallo!

Scheint wirklich daran zu liegen, macht ja auch Sinn :-)

Frag doch, nachdem Du den Index von "werk=" ermittelt hast, einfach ab, ob die Position >= 0 ist und nur dann führst Du den Rest dieses Schleifendurchlaufs aus.

Also so:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
// Suche nach "Werk="
PositionString = str.IndexOf(Suche);
if (PositionString >= 0)
{
  // Suche nach erstem Leerzeichen, beginnend nach Auffinden von "Werk="    
  PositionStringLeer = str.IndexOf(SucheLeer, PositionString); 
                            
  Console.Write("{0} ", PositionStringLeer);

  Console.Write("Die Werksnummer lautet: ");

  Ergebnis = str.Substring(PositionString + Laenge, PositionStringLeer - (PositionString + Laenge));
  Console.Write("{0} ", Ergebnis);
  Console.WriteLine();
}


Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Micha_S Threadstarter
Hält's aus hier
Beiträge: 8

Windows XP Home SP2
C#
BeitragVerfasst: So 05.03.06 13:43 
Hmm, war dann doch gestern (heute morgen) etwas sehr spät... :oops:
Das war es Christian, jetzt funktioniert es. :D

Vielen Dank und schönen Sonntag noch!

Gruss
Mica