Wie kann ich es so machen, dass in C# ein Text File von einem Wort bis zu einem bestimmten anderen Wort nur liest?

FaTech  23.01.2022, 18:02

Wie sieht die Datei denn mit mehreren Daten aus? So? Oder beinhaltet die Datei nur 1

Anfang:
Name: ABC
Nummer: 123
Adresse: XXX
Ende
Anfang:
Name: ABC
Nummer: 123
Adresse: XXX
Ende
NFSMostWanted29 
Fragesteller
 23.01.2022, 18:20

Name: ABC

Nummer: 123

Adresse: XXX

FaTech  23.01.2022, 18:22
Name: ABC
Nummer: 123
Adresse: XXX

Was wenn mehrere Daten vorhanden sind? Und was ist, wenn Daten vertauscht sind? Also Name Nummer Adresse und der andere Adresse Name Nummer?

NFSMostWanted29 
Fragesteller
 23.01.2022, 18:24

Es soll nicht die ganze Text Datei ausgelesen werden, nur die Daten der jeweiligen Person dessen Name man in der Konsole angegeben hat.

FaTech  23.01.2022, 18:25

Haben die Daten immer 100% die richtige Reihenfolge?

Name, Nummer, Adresse, Name, Nummer, Adresse? Oder kann das Variieren?

NFSMostWanted29 
Fragesteller
 23.01.2022, 18:26

In der Text Datei wird immer nur Name, Nummer, Adresse angezeigt, in der Reihenfolge.

3 Antworten

Von einem Experten bestätigt

Es gibt dafür verschiedene Wege, das Problem zu lösen. Einer davon wäre der hier:

private static void FindContact(string path, string searchWord, out string name, out string number, out string address)
{
  int found = -1;

  name = String.Empty;
  number = String.Empty;
  address = String.Empty;

  foreach (string line in File.ReadLines(path))
  {
    string key = line.Split(':')[0];
    string value = line.Split(':')[1].TrimStart();

    if (key.Equals("name", StringComparison.CurrentCultureIgnoreCase) && value.Equals(searchWord, StringComparison.CurrentCultureIgnoreCase))
    {
      found = 0;
    }

    switch (found)
    {
      case 0:
        name = value;
        break;
      case 1:
        number = value;
        break;
      case 2:
        address = value;
        break;
    }

    if (found > -1)
        found++;

    if (found == 3)
    {
        break;
    }
  }
}

Hier wird solange nach dem Namen gesucht, bis er gefunden wurde und dann wird noch 2 weitere Schritte weiter gegangen, um auch die anderen Daten zu erfassen. Die Daten werden dann über out string name, number und address ausgegeben.

Ein Anwendungsbeispiel wäre:

string searchWord = Console.ReadLine();

FindContact("test.txt", searchWord, out string name, out string number, out string address);

Console.WriteLine($"{name} {number} {address}");

Console.ReadKey();

NFSMostWanted29 
Fragesteller
 23.01.2022, 20:28
string value = line.Split(':')[1].TrimStart();

Wieso muss man nach Line.Split(":") noch [1] schreiben und was macht TrimStart() ?

StringComparison.CurrentCultureIgnoreCase

Was macht das hier?

0
FaTech  23.01.2022, 20:38
@NFSMostWanted29

Split trennt es in einen array Name: ABC ist position0: position1

Du willst position1, also nur ABC und TrimStart, damit die Leertaste vor dem Namen noch weg kommt, da die ja nach dem Split noch da ist

IgnoreCase sorgt dafür, dass du nach abc suchen kannst und dennoch ABC gefunden wird, da der Groß- /Kleinschreibung ignoriert

1
NFSMostWanted29 
Fragesteller
 23.01.2022, 21:00
@FaTech

Und eine einzige Frage noch, was macht "out" in z.B "out string name" ?

0
FaTech  23.01.2022, 21:11
@NFSMostWanted29

Wir wollen die ausgabe ja haben. Das problem ist, dass ein return nur einen string oder eine liste geben kann. Also habe ich mir überlegt, out zu benutzen. Damit stellen wir der Methode Variablen Bereit, wo die Methode die Daten rein speichern soll und durch das out bekommen wir die Daten am Ende wieder raus, ohne dass die Verworfen werden. Heißt wir können danach einfach mit name und co weiterarbeiten, ohne dass wir irgendeinen anderen return brauchen

1

Lies Zeile für Zeile und schau dir immer den Key vor dem Buchstaben an.
Sobald Du das erste Mal "Name: ABC" findest, merkst Du dir, dass Du bei "ABC" bist und zeigst ab da alle Daten an. Sobald Du wieder "Name:" mit einem anderen Wert findest, kannst Du die Schleife beenden.
So ist auch die Reihenfolge nicht relevant, es zählt nur, dass alle Daten zu einer Person immer zwischen zwei "Name"-Zeilen stehen.

LINQ geht, ist aber mMn. überflüssig und birgt zu viele Fallstricke, für etwas, das auch so schon sehr einfach zu lösen ist.

Woher ich das weiß:Berufserfahrung – C#.NET Senior Softwareentwickler

NFSMostWanted29 
Fragesteller
 23.01.2022, 18:39

Ich werde es mal gleich sofort ausprobieren, vielen Dank!

0

Mit den Methoden von Linq wäre es ein Kinderspiel aber mir fehlt die genaue Aufgabenstellung was genau du erreichen willst, sonnst könnte ich mit einem Beispiel helfen.

Woher ich das weiß:Berufserfahrung

NFSMostWanted29 
Fragesteller
 23.01.2022, 18:22

Wenn man den Namen vom Benutzer eingibt, sollen Name, Nummer und Adresse der Person angezeigt werden auf der Konsole. Es soll nicht alles aus der Text Datei ausgelesen werden, sondern nur die Daten der jeweiligen Person dessen Namen man in der Konsole eingegeben hat.

0