Entwickler-Ecke

Basistechnologien - Bestimmte Zeilen nichts auslesen lassen


Binosyst - Di 02.08.11 13:55
Titel: Bestimmte Zeilen nichts auslesen lassen
Ich habe eine Textdate mit mehreren Zeilen und lasse diese in einem Textfeld ausgeben.
Allerdings gibt es in der Textdatei einige Zeilen, die alle gleich beginnen (mit "||"), die nicht in der textbox ausgegeben werden sollen.
Wie kann ich es einrichten, dass alle anderen Zeilen ausgegeben, aber diese bestimmten übersprungen werden?


dark-destination1988 - Di 02.08.11 15:06

---textdatei einlesen
Zeilenweise Kontrolle

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
foreach(string st in text)
{
    if(st.Substring(0,2)!="||")
    {
       //weitere verarbeitung
    }
}


Binosyst - Di 02.08.11 15:36

Momentan sieht mein Code folgendermaßen aus:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
 string outputText;
 StreamReader readerText = new StreamReader("C:/Users/User/Temp/Test.txt");
 outputText = readerText.ReadLine();
 foreach (string st in outputText)
 {
    if (st.Substring(0,2) != "||")
    {
      textBox2.Text = outputText;
    }
 }
  readerText.Close();


Ich erhalte allerdings die Fehlermeldung "Eine Konvertierung vom Typ "char" in "string" ist nicht möglich." Zeile 4
Was muss ich dort noch ändern?


bakachan - Di 02.08.11 15:50

outputText ist bei dir ein String
im Beispiel von Dark ist text ein Stringarray oder eine Liste von Strings (o.ä.), da liegt der unterschied

Kopier am besten nicht einfach sondern denke ein wenig nach.
Du liest eine Zeile ein (ReadLine) und dann möchtest du falls diese Zeile nicht mit "||" anfängt etwas damit tun.
Richtig?

Also musst du doch nach dem Einlesen der Zeile nur prüfen ob sie mit "||" anfängt (nicht diese komische schleifenkonstrukt innerhalb eines einzelnen strings verwenden). Dabei gibt es schon entsprechende Funktionen direkt an der String-Klasse (z.B. StartsWith)


Binosyst - Di 02.08.11 17:00

Ich möchte wenn die Zeile mit "||" anfägt nichts damit tun.
In der Textdatei steht beispielsweise:
Zitat:

Text1
||Text2
Text3


Ausgegeben werden sollen dann aber nur "Text1" und "Text2".
Dafür muss ich dann aber ja in einer Schleife alle Zeilen überprüfen.
Wie kann ich aber herrausfinden wieviele Zeilen die Datei hat, damit die Schleife auch nur so oft durchläuft?
Ich hatte da an etwas in dieser Richtung gedacht:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
            while (t < AnzahlDerZeilen)
            {
                outputText = readerText.ReadLine();
                if (outputText.StartsWith("||"))
                    {
                        outputText = null;
                    }
                else textBox2.Text = outputText;
                t++;
            }

Wobei ich dort auch immer nur die letzte Zeile und nicht alle Zeilen ohne "||" in meiner TextBox hätte.


Th69 - Di 02.08.11 18:32

Hallo Binosyst,

durch die Zuweisung (mittels =) überschreibst du ja auch immer den alten Inhalt der TextBox.
Entweder += benutzen (und vor der Schleife die TextBox auf String.Empty bzw. "" setzen) oder aber noch besser die Methode

C#-Quelltext
1:
textbox.AppendText(line);                    

benutzen.

P.S. Anstatt die Anzahl der Zeilen vorher zu bestimmen, einfach den StreamReader solange lesen lassen bis 'null' bei ReadLine zurückgegeben wird:

C#-Quelltext
1:
2:
3:
4:
while((line = readerText.ReadLine()) != null)
{
  ...
}


Flitzs - Di 02.08.11 18:41

Hallo!
Der StreamReader teilt dir mittels der Eigenschaft EndOfStream mit, wann keine Zeilen mehr verfügbar sind.

Beispiel:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
StreamReader readerText = new StreamReader(@"C:/Users/User/Temp/Test.txt");
            string currentLine;            
            while (!readerText.EndOfStream)
            {
                currentLine = readerText.ReadLine();
                if (!currentLine.StartsWith("||"))
                    textBox1.AppendText(string.Format("{0}{1}", currentLine, Environment.NewLine));
            }
            if(textBox1.Text.Length != 0)
                textBox1.Text = textBox1.Text.Substring(0, textBox1.Text.Length - Environment.NewLine.Length); //Überflüssiges /r/n am Ende entfernen            
            readerText.Close();
            readerText.Dispose();


Beachte, dass der Streamreader möglicherweise unmanaged resources anlegt, daher sollte man seine Dispose Methode aufrufen, wenn man ihn nicht mehr verwenden möchte oder den ganzen Lese/Schreib-Vorgang in einen Using-Block verfrachten:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
  using (StreamReader readerText = new StreamReader(@"C:/Users/User/Temp/Test.txt"))
            {
                string currentLine;
                while (!readerText.EndOfStream)
                {
                    currentLine = readerText.ReadLine();
                    if (!currentLine.StartsWith("||"))
                        textBox1.AppendText(string.Format("{0}{1}", currentLine, Environment.NewLine));
                }
                if(textBox1.Text.Length != 0)
                    textBox1.Text = textBox1.Text.Substring(0, textBox1.Text.Length - Environment.NewLine.Length); //Überflüssiges /r/n am Ende entfernen            
                readerText.Close();
            }


Du könntest aber auch auf den StreamReader verzichten und stattdessen die File-Klasse verwenden:

C#-Quelltext
1:
2:
3:
4:
5:
foreach (var line in File.ReadAllLines(@"C:/Users/User/Temp/Test.txt"))
              if (!line.StartsWith("||"))
                  textBox1.AppendText(string.Format("{0}{1}", line, Environment.NewLine));    
if(textBox1.Text.Length != 0)            
   textBox1.Text = textBox1.Text.Substring(0, textBox1.Text.Length - Environment.NewLine.Length); //Überflüssiges /r/n am Ende entfernen


lg Flitzs


Binosyst - Di 02.08.11 19:41

Vielen Dank es läuft nun alles wie gewünscht.
Nun wirft sich mir jedoch noch die Frage auf was genau '\n' und '\r' hier bewirken.

C#-Quelltext
1:
textBox1.Text = textBox1.Text.TrimEnd('\n''\r');                    


Flitzs - Di 02.08.11 20:55

Hallo!
Siehe Hier [http://de.wikipedia.org/wiki/Zeilenumbruch#Codierung_des_Zeilenumbruchs]

lg Flitzs