Announcement

Collapse
No announcement yet.

Zeile in einer Datei bestimmen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zeile in einer Datei bestimmen

    Hallo,
    ich habe folgendes Problem. Ich würde gerne einen String mit einer Text-Datei vergleichen und die Zeile in der sich der String befindet, lückenlos löschen.
    Also in etwa so:

    [highlight=c#]List<string> lines = File.ReadAllLines(userFilePath + @"\UserFile.usr").ToList<string>();

    string name = DeleteUserTextBox.Text;
    int lineIndex = lines.IndexOf(name);
    lines.RemoveAt(lineIndex - 1);

    File.WriteAllLines(userFilePath + @"\UserFile.usr", lines);
    [/highlight]

    Das Problem ist, dass IndexOf() einen nullbasierten Index liefert. Damit kann ich aber nichts anfangen. Ich bräuchte die genaue Zeilennumer.
    Zuletzt editiert von Daniyyel; 13.09.2012, 13:10.

  • #2
    Warum? Der Index der aus IndexOf fällt ist genau der Index denn du auch für RemoveAt brauchst(Alles ist 0-basiert nicht nur ein Teil).

    Ich versteh auch nicht warum du nicht einfach lines.Remove(name) verwendest. Wenn der name mehrmals enthalten sein kann dann einfach in einer Schleife mehrfach aufrufen bis Remove false liefert.

    Comment


    • #3
      lines.Remove(name) funktioniert nicht. Warum weiß ich nicht genau, aber selbst wenn, dann würde nur der entsprechende String verschwinden und nicht die ganze Zeile, oder?
      Naja und IndexOf liefert mir immer 0 zurück.

      Comment


      • #4
        Warum weiß ich nicht genau, aber selbst wenn, dann würde nur der entsprechende String verschwinden und nicht die ganze Zeile, oder?
        Nein du kannst nur auf ganze Element in der Liste prüfen und ganze Elemente entfernen. IndexOf testet ob Listenelement = name und nicht ob name in Listenelement enthalten ist. Stell dir vor du hättest eine List<Integer> und würdest mit IndexOf nach 1 suchen. Wenn IndexOf so funktionieren würde wie du es dir wünscht müßte Index of dann auch eine 10 finden. Das macht keinen Sinn. Eine Teilstringsuche müßtest du schon ausprogrammieren IndexOf hilft da nicht.

        Comment


        • #5
          Ah ok ich verstehe, das bedeutet ich müsste in lines.Remove() die ganze Zeile eingeben, damit sie gelöscht wird. Das hilft mir teilweise weiter. Die Lösung ist nicht unbedingt schön.
          Kann man vielleicht irgendwie mit der Methode -> [highlight=c#]StartsWith(String)[/highlight] etwas anfangen? / http://msdn.microsoft.com/en-us/libr...tartswith.aspx
          Zuletzt editiert von Daniyyel; 13.09.2012, 14:41.

          Comment


          • #6
            Geht bestimmt auch ganz wunderbar mit LINQ

            [highlight=c#]
            void Main()
            {
            var counter = 1;
            var fileData = new string[] { "line1","line2","line3","zeile4","zeile5" };
            var searchString = "zeile";
            var foundLines = from countLine in (
            from line in fileData
            select new { count = counter++, content = line }
            )
            where countLine.content.Contains(searchString)
            select countLine.count;

            foreach(var foundLine in foundLines)
            {
            Console.WriteLine(foundLine);
            }
            }
            [/highlight]

            Mal wieder ein bischen die "schöne" LINQ Syntax geübt.

            Comment


            • #7
              Schick. Das kann LINQ aber auch kürzer

              [Highlight=C#]
              var fileData = new string[] { "line1","line2","line3","zeile4","zeile5" };
              var searchString = "zeile";

              fileData.RemoveAll(x => x.Contains(searchString));[/Highlight]


              Edit. Wenn du weißt das der gesuchte String immer am Anfang steht kannst du Contains (in meinen oder fanderlfs Code) auch durch StartsWith ersetzen.
              Zuletzt editiert von Ralf Jansen; 13.09.2012, 14:56.

              Comment


              • #8
                Ok also ich habs jetzt so gelöst. Ich lade alle Zeilen in einen String-Array, frage ab welches Element mit meinem gesuchten String beginnt und leere dieses Element. Dann leere ich die gesamte Datei und schreibe meinen neuen String-Array wieder rein. Jetzt habe ich zwar eine Lücke in der Textdatei, aber das macht meiner Anwendung wegen "StringSplitOptions.RemoveEmptyEntries" nichts aus.
                [highlight=c#]StreamReader userFileReader = new StreamReader(userFilePath + @"\UserFile.usr");
                string userpass = userFileReader.ReadToEnd();
                userFileReader.Close();
                string[] userpassSplit = userpass.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);

                for (int i = 0; i < userpassSplit.Length; i++)
                {
                if (userpassSplit[i].StartsWith(DeleteUserTextBox.Text))
                userpassSplit[i] = string.Empty;
                }

                File.WriteAllText(userFilePath + @"\UserFile.usr", string.Empty);

                StreamWriter userFileWriter = new StreamWriter(userFilePath + @"\UserFile.usr", true);
                for (int i = 0; i < userpassSplit.Length; i++)
                {
                userFileWriter.WriteLine(userpassSplit[i]);
                }
                userFileWriter.Flush();
                userFileWriter.Close();[/highlight]

                Comment


                • #9
                  Eure Variante scheint mir jetzt dann aber doch etwas schöner zu sein. Ich kenn mich nur leider mit LINQ nicht viel aus.
                  Also ich habe eure Idee bei mir jetzt so implementiert: [highlight=c#]StreamReader userFileReader = new StreamReader(userFilePath + @"\UserFile.usr");
                  string userpass = userFileReader.ReadToEnd();
                  userFileReader.Close();
                  string[] userpassSplit = userpass.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
                  var fileData = userpassSplit;
                  fileData.RemoveAll(x => x.StartsWith(DeleteUserTextBox.Text));[/highlight]
                  Allerdings sagt mir jetzt der Compiler, dass System.Array keine Definition für die RemoveAll Methode enthält. Linq using Direktive steht bei mir drin. Was müsste ich denn da machen?

                  Comment


                  • #10
                    Du hattest bisher eine List<string> die kennt RemoveAll. Du hast aber mittlerweile auf eine Array umgestellt das kennt RemoveAll nicht. Ein Array ist bei dir auch unglücklich die willst ja durch das löschen die Menge der Elemente ändern. Ein Array hat aber eine fixe Größe. Ein löschen in einem Array würde also nur dazu führen die entsprechende Stelle im Array auf null zu setzen. Die Stelle und der entsprechende Index existiert aber natürlich immer noch. In deinem Code schreibst du da ja scheinbar auch einfach eine Leerzeile hin anstatt die Zeile wirklich zu löschen.

                    Comment


                    • #11
                      Ah ok, perfekt. Vielen lieben Dank, jetzt funktioniert es genau wie ich es mir vorgestellt habe.
                      Lösung -> [highlight=c#]List<string> lines = File.ReadAllLines(userFilePath + @"\UserFile.usr").ToList<string>();
                      var fileData = lines;
                      fileData.RemoveAll(x => x.StartsWith(DeleteUserTextBox.Text));
                      File.WriteAllLines(userFilePath + @"\UserFile.usr", lines);[/highlight]

                      Comment


                      • #12
                        Originally posted by Ralf Jansen View Post
                        Schick. Das kann LINQ aber auch kürzer

                        [Highlight=C#]
                        var fileData = new string[] { "line1","line2","line3","zeile4","zeile5" };
                        var searchString = "zeile";

                        fileData.RemoveAll(x => x.Contains(searchString));[/Highlight]


                        Edit. Wenn du weißt das der gesuchte String immer am Anfang steht kannst du Contains (in meinen oder fanderlfs Code) auch durch StartsWith ersetzen.
                        Da hab ich aber keine Zeilennummer, sondern nur den Inhalt der Zeile die den gesuchten Text enthält

                        Comment

                        Working...
                        X