Laden...

String.Replace: Problem mit Zeilenumbruch

Erstellt von TommyGER vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.413 Views
T
TommyGER Themenstarter:in
14 Beiträge seit 2010
vor 14 Jahren
String.Replace: Problem mit Zeilenumbruch

Hallo,
undzwar baue ich grade ein kleines programm für mich was mir die arbeit mit einigen dateien erleichtern soll.
Bin soweit damit fertig und funktioniert auch alles aber leider habe ich folgendes Problem.

Beispiel:

richTextBox1.Text = richTextBox1.Text.Replace("IsUseParUV: 0", "");

So sieht das zurzeit aus.
Wenn es ausgeführt wird bleibt eine leere Zeile stehen.
Wie kann ich das beheben?

Freue mich über antworten 😃 Danke

2.223 Beiträge seit 2005
vor 14 Jahren

Hallo TommyGER und Herzlich Willkommen hier im Forum,

mit diesen Informationen kann ich Dir leider noch keine zufriedenstellende Antwort geben, außer dass diese Lösung nicht gerade der performanteste oder Sauberste Weg ist.

kannst Du uns nähere informationen zu dem Inhalt der RichtexBox mitteilen?
oder wie der Text in die Richtextbox kommt?
oder mal mal ein wenig mehr Quellcode, der mit diesem probelm zu tun hat.

Möglicher weise haben wir dann auch eine Idee, wie man das besser machen könnte.

Herzliche Grüße
Lars

T
TommyGER Themenstarter:in
14 Beiträge seit 2010
vor 14 Jahren

hallo,
Zurzeit beinhaltet das programm diesen Code

private void button1_Click(object sender, EventArgs e)
        {
            if (this.radioButton3.Checked == true)
                this.
            richTextBox1.Text = richTextBox1.Text.Replace("MOXTVersion: 73", "MOXTVersion: 58");
            richTextBox1.Text = richTextBox1.Text.Replace("MOXTVersion: 76", "MOXTVersion: 58");
            richTextBox1.Text = richTextBox1.Text.Replace("MOXTVersion: 62", "MOXTVersion: 58");
            richTextBox1.Text = richTextBox1.Text.Replace("MOXTVersion: 79", "MOXTVersion: 58");
            richTextBox1.Text = richTextBox1.Text.Replace("PhysExist: 0", "");
            richTextBox1.Text = richTextBox1.Text.Replace("IsUseParUV: 0", "");
            richTextBox1.Text = richTextBox1.Text.Replace("ParIniDir: 0.000000, 0.000000, 0.000000", "");
            richTextBox1.Text = richTextBox1.Text.Replace("IsUseHSVInterp: 0", "");
            richTextBox1.Text = richTextBox1.Text.Replace("IsAvgGen: 0", "");
            richTextBox1.Text = richTextBox1.Text.Replace("AlphaSeg: 10", "");
            richTextBox1.Text = richTextBox1.Text.Replace("BetaSeg: 10", "");
            richTextBox1.Text = richTextBox1.Text.Replace("YawEffect: 0", "");
            richTextBox1.Text = richTextBox1.Text.Replace("TexAnimMaxTime: 0", "");
            richTextBox1.Text = richTextBox1.Text.Replace("ResetLoopEnd: 0", "");
            richTextBox1.Text = richTextBox1.Text.Replace("TexAnimMaxTime: 0", "");
            richTextBox1.Text = richTextBox1.Text.Replace("IsStartOnGrnd: 0", "");
            {

Das Programm öffnet eine text datei und soll daraus eine wörter wie hier geschrieben rauslöschen.
habe nur diese methode gefunden und bin noch sehr neu in C#.
Aber mit dieser Methode bleibt leider eine leere zeile

2.223 Beiträge seit 2005
vor 14 Jahren

Hallo ,

auf die schnelle kann ich inn diesem Code kein Problem erkennen,
mir scheint das das Problem an einer anderen stelle liegt.
hast du schon mal dein Programm gedebugged?

Herzliche Grüße
Lars

T
TommyGER Themenstarter:in
14 Beiträge seit 2010
vor 14 Jahren

Also ich habe das programm gedebuggt und es läuft ja alles.
Aber mit diesem Code

        richTextBox1.Text = richTextBox1.Text.Replace("PhysExist: 0", "");  

ersetzt er PhysExist: 0 mit "" also nichts und dadurch bleibt die leere zeile stehen

2.223 Beiträge seit 2005
vor 14 Jahren

Hmm gehe ich recht in der Annahme, dass die der Zeilenumbruch stört?

Herzliche Grüße
Lars

T
TommyGER Themenstarter:in
14 Beiträge seit 2010
vor 14 Jahren

ja 😃 und ich hab vieles versucht aber irgendwie klappt nichts

2.223 Beiträge seit 2005
vor 14 Jahren

versuche es doch einmal so


Replace(@"IsUseParUV: 0\n", "");

Herzliche Grüße
LArs

T
TommyGER Themenstarter:in
14 Beiträge seit 2010
vor 14 Jahren

hallo,
also habs jetzt damit ausprobiert.

        richTextBox1.Text = richTextBox1.Text.Replace(@"IsUseParUV: 0\n", "");  

leider bleibt die leerzeile trotzdem

so siehts aus:

Davor:

OrgPt: 0.500000
OrgPt: 0.500000
IsUseParUV: 0
EmissionRate: 65.000000

danach:

OrgPt: 0.500000
OrgPt: 0.500000

EmissionRate: 65.000000

2.223 Beiträge seit 2005
vor 14 Jahren

Schau Dir doch die Datei einmal in einem Editor an der Dir auch steuerungszeichen anzeigen kann ZB. Notepad++ und suche mal an welcher stelle da das steuerungszeichen steht.

oder versuche mal die Datei hier anzuhängen wenn diese nicht zu gross ist

HErzliche Grüße
LArs

T
TommyGER Themenstarter:in
14 Beiträge seit 2010
vor 14 Jahren

Versteh ich leider nicht ganz was du meinst 😃
bzw was es mit der datei zu tun hat den ich habe 1000 von dateien wo das ist 😃

Es ist einfach das er die zeile mit dem "" ersetzt was eine leere zeile dann ergibt.
Bringt es was wenn ich den kompletten code mal reinstelle?

J
3.331 Beiträge seit 2006
vor 14 Jahren

Hallo Tommy und nachträglich willkommen,

Lars' Hinweis mit dem '\n' führt in die richtige Richtung, vor allem seine Nachfrage, mit welchen Steuerungszeichen ein Zeilenumbruch gespeichert ist. Standard unter NET ist Environment.NewLine, das bezieht sich auf den Zeilenumbruch des Systems. Es kommt aber vor, dass Programme das abweichend regeln, also mit '\n' oder "\r\n" oder "\n\r", vielleicht auch nur '\r' (auch wenn das sehr selten ist).

Die leere Zeile wird nicht durch "" erzeugt, sondern durch den nachfolgenden übriggebliebenen Zeilenumbruch. Diesen musst du in Replace einbauen; dazu musst du die richtige Schreibweise kennen und benutzen.

Dein letzter zitierter Versuch ist jedenfalls falsch:

richTextBox1.Text = richTextBox1.Text.Replace(@"IsUseParUV: 0\n", "");

Richtiger wäre:

richTextBox1.Text = richTextBox1.Text.Replace("IsUseParUV: 0\n", "");

Durch '@' sagst du dem Compiler, dass '' als normales Zeichen zu verstehen ist und dahinter ein 'n' folgen soll. Gemeint ist aber an dieser Stelle, dass auch das Zeichen '\n' zu ersetzen ist. Eigentlich wäre das die beste Lösung:

richTextBox1.Text = richTextBox1.Text.Replace("IsUseParUV: 0" + Environment.NewLine, String.Empty);

Die funktioniert so aber (wie erläutert) nur dann, wenn der vorhandene Zeilentrenner mit dem des Systems übereinstimmt.

Wie Lars schon geschrieben, ist dein Verfahren nicht optimal. Es enthält vor allem zwei Mängel:
* Strings sind unveränderlich. Bei String.Replace wird jedesmal ein neuer String erzeugt und registriert, der alte für den GC freigegeben.
* Jedes Replace-Ergebnis übergibst du zur Anzeige an die RTB, statt es intern weiter zu verarbeiten und erst das Endergebnis anzuzeigen.

Besser ist :rtfm: StringBuilder:1.Erzeuge aus dem vorhandenen Text eine StringBuilder-Instanz. 1.Führe auf dieser Instanz alle Replace-Maßnahmen aus. 1.Setze den letzten Zustand des StringBuilders wieder auf die Text-Eigenschaft der RTB.

Übrigens gehören Namen wie richTextBox1 oder Label23 verboten, siehe .NET Richtlinien für Namen.

Frohes Neues Jahr! Jürgen

T
TommyGER Themenstarter:in
14 Beiträge seit 2010
vor 14 Jahren

Guten morgen,

ich bedanke mich herzlich für die hilfe es funktioniert endlich. 😃

Frohes neues jahr und ein schönes wochenende noch