tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
16
ZUGRIFFE
3703
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Fridulin Fridulin ist offline Mitglied Brokat
    Registriert seit
    Dec 2004
    Beiträge
    309
    Hallo,

    Ich möchte gerne eine Fetse Zeile (die Zeilen Zahl wird von einen Programm gesetzt) Löschen.
    Wie kann man das ambesten machen mit dem StreamWriter?

    Grüße und Danke

    PS: Frohe Ostern!
     

  2. #2
    Fridulin Fridulin ist offline Mitglied Brokat
    Registriert seit
    Dec 2004
    Beiträge
    309
    Hi,

    Hat wirklich keiner eine Idee wie man dies bewekstelligen kann?

    Grüße
     

  3. #3
    Avatar von Niro99
    Niro99 Niro99 ist offline Mitglied Silber
    Registriert seit
    Jan 2005
    Beiträge
    54
    Hallo Fridulin!

    Ein Ansatz:
    1. Mit StreamReader alle Zeilen in string - Array auslesen ("foreach" - Schleife)
    2. Gewünschte Zeile löschen
    3. String - Array mit StreamWriter in Datei (über-)schreiben
     
    So einfach wie möglich. Aber nicht einfacher!
    Albert Einstein

  4. #4
    Caracho Caracho ist offline Mitglied Silber
    Registriert seit
    May 2002
    Beiträge
    73
    so, bitte sehr:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    public void DeleteRowFromFile(String Filename, int Row)
    {
        int i = 1;
        string line = null;
        StringBuilder sb = null;
        
        using( StreamReader sr = new StreamReader(new FileStream(Filename, FileMode.Open)) )
        {
            sb = new StringBuilder((int)sr.BaseStream.Length);
     
            while( (line = sr.ReadLine()) != null )
                if( Row != i++ )
                    sb.Append(line).Append(Environment.NewLine);
        }
     
        using( StreamWriter sw = new StreamWriter(new FileStream(Filename, FileMode.Create)) )
            sw.Write(sb.ToString());
    }
     

  5. #5
    Fridulin Fridulin ist offline Mitglied Brokat
    Registriert seit
    Dec 2004
    Beiträge
    309
    Hallo,

    vielen Dank erstmal euch beiden, ich war gestern Nachmittag nicht mehr im Netz deswegen konnte ich da deines noch nicht lesen Caracho, ich habe es denn selber folgendermaßen gelößt:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    [color=#ff0000]void [/color][b][color=#191970]neuabspeichern[/color][/b][color=#191970][/color][color=#006400]([/color][color=#ff0000]string [/color][color=#006400][] [/color]arrZeilen[color=#006400], [/color][b][color=#ff0000]int [/color][/b][color=#ff0000][/color]auswahl[color=#006400])[/color]
    [color=#006400]{[/color]
    StreamWriter sw [color=#006400]= [/color][b][color=#008b8b]new [/color][color=#191970]StreamWriter[/color][/b][color=#191970][/color][color=#006400]([/color]Application[color=#006400].[/color]StartupPath [color=#006400]+ [/color][color=#ff00ff]"\" [/color][color=#006400]+ [/color][color=#ff00ff]"speicher.txt"[/color][color=#006400], [/color]
    [b][color=#008b8b]alse[/color][/b][color=#008b8b][/color][color=#006400]);[/color]
    [b][color=#ff0000]int [/color][/b][color=#ff0000][/color]wieviele [color=#006400]= [/color]inhalt[color=#006400].[/color]Items[color=#006400].[/color]Count[color=#006400];[/color]
    [b][color=#ff0000]int [/color][/b][color=#ff0000][/color]i [color=#006400]= [/color][color=#00008b]0[/color][color=#006400];[/color]
    [b][color=#0000ff]while [/color][/b][color=#0000ff][/color][color=#006400]([/color]i [color=#006400]< [/color]wieviele[color=#006400])[/color]
    [color=#006400]{[/color]
    [b][color=#0000ff]if [/color][/b][color=#0000ff][/color][color=#006400]([/color]i [color=#006400]!= [/color]auswahl[color=#006400])[/color]
    [color=#006400]{[/color]
    sw[color=#006400].[/color][b][color=#191970]WriteLine[/color][/b][color=#191970][/color][color=#006400]([/color]arrZeilen[color=#006400][[/color]i[color=#006400]]); [/color]
    [color=#006400]}[/color]
    i[color=#006400]++;[/color]
    [color=#006400]}
    [/color]sw[color=#006400].[/color][b][color=#191970]Close[/color][/b][color=#191970][/color][color=#006400]();[/color]
    [color=#006400][/color]


    Die Variable auswahl ist das Item welches ich Ausgewählt habe in der ListBox, mit folgendem Code wird es gesetzt:

    Code :
    1
    
     
    Code :
    1
    2
    
    [color=black]auswahl = inhalt.SelectedIndex;[/color]
    [color=black][/color]


    Also vielen Dank nochmal für eure Hilfe!

    Grüße
     

  6. #6
    Fridulin Fridulin ist offline Mitglied Brokat
    Registriert seit
    Dec 2004
    Beiträge
    309
    Hallo Leute,

    ich habe diesen Thread noch einmal "ausgegraben" da der gepostete Code zwar funktioniert, aber leider nicht immer. Ich lasse in einer anderen Schleife eine Textdatei auslesen und sobald dort etwas übereinschtimmt, wird die Funktion aufgerufen. Leider löscht der Code immer nur ein paar Zeilen. Ich habe die Vermutung, daß die Funktion zu schnell von der anderen Schleife aufgerufen wird und deswegen klappt es nicht. Aber es ist nur eine wage Vermutung.
    Wenn jemand eine Idee hat, oder ein ganz anderen Weg weiß wie man eine vordefinierte Zeile einer Textdatei löschen kann, würde ich mich sehr freuen wenn ihr dies Postet.

    Viele Grüße und eine gute Nacht wünsche ich
    Fridulin

    PS: Ich habe Caracho's Funktion gebommen.
     

  7. #7
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Zwar keine schöne Lösung, aber im Anhang findest einen entsprechenden Anhaltspunkt
    Angehängte Dateien Angehängte Dateien
     

  8. #8
    Fridulin Fridulin ist offline Mitglied Brokat
    Registriert seit
    Dec 2004
    Beiträge
    309
    Hallo,

    vielen Dank für das Programm, der Programmtext funktioniert wunderbar.

    Viele Grüße und vielen dank noch einmal
    Fridulin
     

  9. #9
    Fridulin Fridulin ist offline Mitglied Brokat
    Registriert seit
    Dec 2004
    Beiträge
    309
    Hi,

    mißt, da habe ich mich zufrüh gefereut. Ich habe dein Beispiel nocheinmal genauer Testen können. Auch dein Beispiel funktioniert leider auch nicht richtig.

    Merkwürdigerweise um so mehr Zeilen er löschen soll um so mehr löscht er auch, aber wenn er nur 2 löschen soll, dann löscht er nur eine Zeile. Ein Fehler gibt er aber auch nicht aus. Beim nächsten Programm durchlauf löscht er die Zeile auch, die er beim ersten Durchlauf nicht gelöscht hat.
    Der Aufruf der Funktion funktioniert Tadelos, das habe ich mehrfach getestet.
    Code :
    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
    
    void zeileloeschen (int zeile)
            {
                
    int count = 0;
    count = zeile;
    //MessageBox.Show(count + ""); << Nur zum Testen des Aufrufes.
     
                int currCount = 0;
                string s = null;
                try{
                    
                
                if (count >= 0) 
                {
                    StringBuilder sb = new StringBuilder();
     
                    StreamReader sr = new StreamReader("anwesende.txt");
                    while ( ( s = sr.ReadLine()) != null) 
                    {
                        
                        if (currCount != count)
                        {
                        sb.Append(s + System.Environment.NewLine);
                        }
                        currCount++;
                    }
                    sr.Close();
     
                    StreamWriter sw = new StreamWriter("anwesende.txt");
                    sw.Write(sb.ToString());
                    sw.Close();
                    
                } 
                
                }
                catch{
                    status.Text = "Fehler beim löschen in der Anwesenheitsliste";
                    string waslos = "Fehler beim löschen in der Anwesenheitsliste"; 
                string loginname = null;
                string loginpasswort = null;
                string loginip = null;
                log(loginname, loginpasswort, loginip, waslos);
                }
     
            }

    Vielleicht hat ja jemand noch eine Idee, wie man das lösen könnte.

    Viele Grüße und vielen Dank im Voraus.
    Fridulin


    ---Edit:
    Ich habe den Fehler nun gefunden. Sobald ich am Anfang der Datei eine Zeile löschen möchte und am ende, sowie dazwischen viele andere Zeilen sind, löscht er beide Zeilen wunderbar. Sobald die Zeilen dichter zusammen sind tut er dies nicht, also kann es nur daran liegen, daß der Funktionsaufruf zu schnell ist.

    Falls jemand eine Idee hat wie man dies Lösen kann, wäre ich sehr Dankbar wenn er es hier postet.

    Viele Grüße und vielen dank
    Fridulin
    Geändert von Fridulin (01.09.06 um 16:44 Uhr)
     

  10. #10
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Achtung, mein Testprogramm löscht eine Anzahl von Zeilen am Beginn einer Datei, nicht eine bestimmte Zeile. Das müsstest du entsprechend anpassen und sollte ansich auch kein Problem darstellen. Musst ja nur die Zeilen mitzählen ...
     

  11. #11
    Fridulin Fridulin ist offline Mitglied Brokat
    Registriert seit
    Dec 2004
    Beiträge
    309
    Hallo,

    tut mir leid das meine Antwort so lange auf sich warten gelassen hat. Ich habe es natürlich umgeschrieben, sodas nur eine Zeile gelöscht wird. Was das Programm auch tut, nur wenn ich die Funktion öfters hintereinander aufrufe (was wohl zu schnell geht), löscht es nicht mehr alle Zeilen. (wobei pro Funktionsaufruf nur eine Zeile gelöscht werden soll.

    Viele Grüße und vielen Dank
    Fridulin
     

  12. #12
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Also, ich würde die Funktion nicht öfter hintereinander aufrufen, weil dies durch das ständige Öffnen der Datei nicht wirklich performant wäre. Schreib dir die zu löschenden Zeilennummern in eine Collection und lösch es in einem Durchlauf. Wie du sowas machen kannst, hat mein kleines Demo-Tool gezeigt. Das anzupassen sollte wirklich kein Problem sein.
     

  13. #13
    Fridulin Fridulin ist offline Mitglied Brokat
    Registriert seit
    Dec 2004
    Beiträge
    309
    Hallo,

    nagut im meinen Programm wird vermutlich die Funktion 1 bis 2 mal hintereinander aufgerufen. Ich habe es öfters nur zu Testzwecken aufgerufen. Im normal Betrieb, sollte dies aber nicht geschriehen. Allerdings funktioniert es schon bei 2 Zeilen nicht mehr.
    Danke für die Informationen bezüglich einer Collecion. Ich binn noch am überlegen, ob es so löse oder ganz die Datei weglasse und es alles in ein Array zwischenspeichere und bearbeite.

    Viele Grüße und vielen Dank für deine Hilfe
    Fridulin
     

  14. #14
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Naja, ich weiß jetzt mittlerweile auch nicht mehr genau wo das Problem liegt: Laut dem letzten Sourcecode-Auszug den du gepostet hast, löscht er ja noch immer n Zeilen von Beginn der Datei an. Das ist ja nicht was du willst? Daher wirst du die Methode umschreiben müssen.
     

  15. #15
    Fridulin Fridulin ist offline Mitglied Brokat
    Registriert seit
    Dec 2004
    Beiträge
    309
    Hallo,

    merkwürdigerkeise tut der Source Code das aber, ich sehe ehrlich gesagt auch nicht warum er immer ab der ersten Zeile löschen soll.
    Die Funktion bekommt die Int Variable "zeile" übergeben, wobei die "count" Variable mit "zeile" gleichgesetzt wird. Dann liest er die Zeilen ein in der while Schleife, esseiden "currCount != count" wobei count die Zeile entspricht, dann schreibt er es nicht in "sb" rein. Später schreibt er alles wieder zurück was in "sb" steht in die Datei. Oder habe ich jetzt einen Denkfehler?

    Viele Grüße
    traumpaar
     

Ähnliche Themen

  1. .dat Datei einzelne Zeile löschen
    Von MopsdeBops im Forum Java
    Antworten: 0
    Letzter Beitrag: 10.01.09, 13:14
  2. Zeile aus einer Datei löschen
    Von RipdEaTh im Forum Java
    Antworten: 0
    Letzter Beitrag: 20.11.06, 12:15
  3. Zeile aus Datei löschen
    Von fiacyberz im Forum PHP
    Antworten: 12
    Letzter Beitrag: 24.11.02, 11:07
  4. Erste Zeile einer Datei löschen...
    Von Warper im Forum PHP
    Antworten: 1
    Letzter Beitrag: 30.04.02, 16:27
  5. n-te zeile aus einer txt datei löschen
    Von Nucleus im Forum PHP
    Antworten: 9
    Letzter Beitrag: 09.03.02, 00:00