Array-Elemente nur unter bestimmten Bedingungen ausgeben



  • Guten Tag,

    (diesmal handelt es sich nicht um eine Hausaufgabe, man darf also spoilern)

    Ich möchte mir nur jene Zeilen einer Text-Datei (Ausgabe eines Test-Tools) ausgeben lassen, die die ErrorMessages enthalten, um diese weiter auswerten zu können.

    Den Text habe ich so eingelesen:

    string text = System.IO.File.ReadAllText(@"C:\Ausgabe\JHOVE_ergebnis\5valide3malformed_8PDF");
    

    Ob überhaupt Fehlermeldungen vorhanden sind, klappt auch:

    bool error = text.Contains("ErrorMessage:");
    
                if (error)
                {
                    Console.WriteLine("Es sind Fehlermeldungen in der Ausgabedatei enthalten");
                    Console.ReadLine();
                }
    
                else
                {
                    Console.WriteLine("Keine Informationen zu Fehlermeldungen gefunden");
                    Console.ReadLine();
                }
    

    [/code]

    Es gelingt mir zwar, aus dem gesamten Text-String eine Liste und auch ein Array zu erstellen und auch, dieses Array zu sortieren.
    Was aber leider nicht klappt, ist die Ausgabe nur jener Zeilen / Elemente der Liste Array-Elemente, die die Fehlermeldungen enthalten. Jene Zeilen starten mit "ErrorMessage", daher hatte ich es für einfach gehalten und es mit .StartsWith und .Contains versucht, das klappt aber nicht.

    const string f = (@"C:\Ausgabe\JHOVE_ergebnis\5valide3malformed_8PDF");
    // Neue Liste erstellen
    List<string> lines = new List<string>();
    
    using (StreamReader r = new StreamReader(f))
    {
    string line;
    while ((line = r.ReadLine()) != null)
    {
    // "line" is a line in the file. Add it to our List.
    lines.Add(line);
    }
    }
    string[] s = lines.ToArray();
    Array.Sort(s);
    
    int i;
    
    for (i = 0; i < s.Length; i++)
    {
    
    //richtig praktisch wäre so etwas:
    // if (s[i].Contains ("ErrorMessage"))
    Console.WriteLine(s[i]);
    }
    Console.ReadLine();
    

    Mein Freund Google weiß vermeintlich viel zu diesem Thema, doch hilft an dieser Stelle nicht mehr weiter.

    Viele Grüße und vielen Dank,
    Yvonne



  • Ich versteh nicht ganz warum du da etwas sortierst, aber das muss ich vermutlich auch nicht.

    Zu deinem eigentlichen Problem:

    Warum machst du nicht einfach die von dir beschriebene Abfrage?
    Hast du dir mal im Compiler angeschaut wie deine Lines aussehen, ob sie ueberhaupt das richtige Format haben fuer die Contains/StartsWith-Abfrage?



  • File.ReadAllLines liefert direkt ein Array der Zeilen, das umständliche einlesen kannst Du Dir also ersparen.

    Dein Ansatz mit StartsWith oder Contains sollte eigentlich funktionieren. "Klappt nicht" ist aber auch keine Fehlerbeschreibung auf die man näher eingehen kann.

    string[] s =File.ReadAllLines(@"C:\mytext.txt"); //new string[] { "Alles gut", "ErrorMessage: bla", "Kein Fehler" };
    for (int i = 0; i < s.Length; ++i)
    	if (s[i].StartsWith("ErrorMessage"))
    		Console.WriteLine(s[i]);
    


  • µ schrieb:

    File.ReadAllLines liefert direkt ein Array der Zeilen, das umständliche einlesen kannst Du Dir also ersparen.

    Natuerlich nur unter der Voraussetzung das sie .NET 4.5 benutzt.



  • Firefighter schrieb:

    µ schrieb:

    File.ReadAllLines liefert direkt ein Array der Zeilen, das umständliche einlesen kannst Du Dir also ersparen.

    Natuerlich nur unter der Voraussetzung das sie .NET 4.5 benutzt.

    ReadAllLines gibt es schon sehr viel länger.
    ReadLines ist neu ab NET 4.0.



  • Ahh stimmt, hab falsch gelesen. Ok Kommando zurueck.



  • Vielen Dank euch beiden für eure Antworten.

    Es ist richtig, das Array lässt sich mit ReadAllLines erstellen (offenbar nutze ich die richtige Version). Mein Wortschatz ist noch sehr sehr begrenzt...

    string [] s = System.IO.File.ReadAllLines(@"C:\Ausgabe\JHOVE_ergebnis\5valide3malformed_8PDF");
                int i;
                Array.Sort(s);
                for (i = 0; i < s.Length; i++)
                {
    
                        Console.WriteLine(s[i]);
                }
                Console.ReadLine();
    

    Das Array habe ich deswegen sortiert, weil ich so auf einen Blick sehen kann, wie viele Zeilen mit "ErrorMessage" beginnen.

    Wie ich im Compiler nachschauen kann, ob die Lines das richtige Format haben, weiß ich nicht. Die von µ vorgeschlagene Lösung

    if (s[i].StartsWith("ErrorMessage"))
    

    gibt die Zeilen zwar nicht aus, aber die gleiche Zeile mit "Contains" liefert dann zu meiner großen Freude jene Zeilen aus. Das ist natürlich klasse, damit kann ich weitermachen.

    Viele Grüße und vielen Dank für die Schnellhilfe,
    Yvonne



  • Yvonne1978 schrieb:

    for (i = 0; i < s.Length; i++)
    {
        Console.WriteLine(s[i]);
    }
    

    Für sowas kann man dann auch einfach

    foreach (string line in s)
    {
        Console.WriteLine(line);
    }
    

    verwenden.

    Das nimmt sich im Enteffekt nichts, aber gerade wenn du sagst, dass dein "Wortschatz" noch begrenzt ist, ist es ja nützlich zu wissen, dass es diese Möglichkeit gibt. 🙂

    PS: Und was die Sache mit line.StartsWith("") angeht, hast du jeztt mein Interesse geweckt. Könntest du vielleicht mal eine Beispieldatei posten?



  • Hallo Darius,

    richtig, es ist gut zu wissen, bisher habe ich foreach meist nur dann verwendet, wenn es im Ausgangsprogramm so wahr. Selber hantiere ich fast nur mit for, if/else if/else und manchmal mit while und do/while - das war es dann fast schon wieder. (1 oder 2x habe ich mich an etwas rekursives gewagt, brauchte dann aber fast immer sofort Hilfe. Ich beschäftige mich erst seit dem 2. Januar mit dem Schreiben kleiner Hilfsprogramme.)

    Die Stellen, die dich interessieren sind vermutlich diese:

    string[] s = System.IO.File.ReadAllLines(@"C:\Ausgabe\JHOVE_ergebnis\Jhove_PDF_ganzerOrdner");
    
    zahlpdf = 0;
                for (pdf = 0; pdf < len; pdf++)
                {
                    if (s[pdf].Contains("Format: PDF"))
                        zahlpdf++;
                }
    

    Ich habe diesen Code-Schnipsel mehrfach verwendet (vermutlich könnte ich mal über eine Funktion nachdenken), und es kommt u. a. hier erneut vor:

    for (i = 0; i < len; i++)
                {
                    if (s[i].Contains("ErrorMessage"))
                    { ....
    

    Ich könnte auch die ganze Datei posten, allerdings sehe sogar ich, dass man sie an vielen Stellen noch optimieren kann, ich habe erst heute Vormittag damit begonnen.

    Aber wenn du möchtest, mache ich das morgen noch, trotz all der "buggy" und "leggy"-Stellen.

    Jetzt werde ich bald Feierabend machen (mein Gehirn fährt allmählich in den Sofa-Modus), aber ich werde sicher im Laufe der Woche noch daran arbeiten.

    Und falls du mit Beispieldatei die Textdatei meinst, die ich untersuche - wie hänge ich die hier an? Mein Format-Erkennungstool kennt das Format nicht, es ist kein txt-Format oder etwas ähnliches und hat auch keine Extension. Jetzt bin ich allmählich auch neugierig, denn ich beschäftige mich schon etwas länger mit Dateiformaten.

    Viele freundliche Grüße, Yvonne


Anmelden zum Antworten