Laden...

string.replace funktioniert nicht (=>falscher Umgang mit Strings)

Erstellt von MrChangeLog vor 7 Jahren Letzter Beitrag vor 7 Jahren 3.359 Views
MrChangeLog Themenstarter:in
121 Beiträge seit 2016
vor 7 Jahren
string.replace funktioniert nicht (=>falscher Umgang mit Strings)

Mein Programm liest daten aus einer MSSQL-Datenbank aus und schreibt sie später in eine CSV-Datei. Dabei werden die Werte Zeilenweise in einen String geschrieben. Nun habe ich die unglückliche Situation, dass is in einer bestimmten Spalte nicht-atomare Werte hat (jeweils zwei IPs) die durch einen Zeilenumbruch getrennt werden.

Um den Zeilenumbruch los zu werden habe ich folgendes geschrieben:


if(row.Contains("\r\n"))
{
     row.Replace("\r\n", " ");
}

(row ist die string-Variable)
Im Debugger sehe ich in 'row' genau diese Zeichenfolge, aber das Replace scheint nicht zu funktionieren.
Hat jemand ne Idee, an was das liegen könnte?

656 Beiträge seit 2008
vor 7 Jahren

Strings sind immutable. Replace gibt den geänderten String zurück, den du aktuell ignorierst.

H
18 Beiträge seit 2010
vor 7 Jahren

Hallo,

wie BhaaL schon geschrieben hast, musst Du das Ergebnis von row.Replace() der Variablen row wieder zuweisen.

Anders sieht es beim StringBuilder aus, dort kann man mit Replace() direkt den Inhalt vom StringBuilder manipulieren.

Die if-Abfrage kannst Du Dir übrigens sparen. Wenn es nichts zu ersetzen gibt dann passiert auch nichts.

Gruß
Patrick

MrChangeLog Themenstarter:in
121 Beiträge seit 2016
vor 7 Jahren

@BhaaL: jup, daran lag's.

Die if-Abfrage kannst Du Dir übrigens sparen. Wenn es nichts zu ersetzen gibt dann passiert auch nichts.

Gruß
Patrick

Stimmt 😁

D
985 Beiträge seit 2014
vor 7 Jahren

Warum alles in einen string klatschen? Es würde sich doch anbieten die Feldwerte in eine IList<string> zu schreiben. Dann geht auch der Export wesentlich einfacher.

Und CSV geht auch mit Zeilenumbrüchen innerhalb der Feldwerte (was die meisten Programmierer gerade beim Einlesen immer wieder gerne vergessen).

MrChangeLog Themenstarter:in
121 Beiträge seit 2016
vor 7 Jahren

Und CSV geht auch mit Zeilenumbrüchen innerhalb der Feldwerte (was die meisten Programmierer gerade beim Einlesen immer wieder gerne vergessen).

Tut es? Wusste ich gar nicht.
Wie wird dann ein Zeilenumbruch innerhalb eines Feldwertes vom Zeilenumbruch am Ende der Zeile, bzw. des Datensatzes unterschieden?

H
523 Beiträge seit 2008
vor 7 Jahren

in einer CSV-Datei gibt es mehrere Trennzeichen: Zeilenumbruch, Spaltentrenner und Feldbegrenzer

Siehe auch [erledigt] Zeilenumbruch innerhalb eines CSV Elements

MrChangeLog Themenstarter:in
121 Beiträge seit 2016
vor 7 Jahren

Man hat verstanden^^

Ich habe mich für das Komma als Separator entschieden; die Datensätze/Zeilen werden durch einen Zeilenumbruch getrennt.
Wenn ich nun einen Zeilenumbruch innerhalb eines Feldwertes belassen möchte, müsste ich jeden Feldwert darauf untersuchen, ob er einen Zeilenumbruch besitzt und gegebenenfalls den Feldwert mit Anführungszeichen umschliessen ... klingt performancemässig aufwändig.

Edit: PS: Wieso heisst es eigentlich Comma-Separated Values, wenn auch andere Separatoren verfügbar sind?

D
985 Beiträge seit 2014
vor 7 Jahren

In der RFC 4180 wird als Trennzeichen ein Comma festgelegt und darum wird dort CSV-Format auch als Comma-Separated-Values Format definiert.

Nun, dieses Comma ist aber im Prinzip willkürlich gewählt und man kann es gegen jedes andere Zeichen austauschen.

Dann könnte man von einem Character-Separated-Values-Format sprechen.

Siehe dazu auch FileHelpers.Net / Examples / QuickStart: Write Delimited File (dort wird z.B. ein | als Trennzeichen genommen)

klingt performancemässig aufwändig.

So einen Contract wie die RFC 4180 peinlichst genau zu erfüllen?
Ja, kann durchaus sein ... aber eine Fehlersuche wegen einem blöden Export-Fehler verbraucht immense Resourcen. Ich wähle dort immer den sicheren Weg, auch wenn der langsam(er) ist.

MrChangeLog Themenstarter:in
121 Beiträge seit 2016
vor 7 Jahren

@Sir Rufo: danke für die Ausführung, das Ausführung und den Link, das war sehr aufschlussreich 🙂

klingt performancemässig aufwändig.
So einen Contract wie die RFC 4180 peinlichst genau zu erfüllen?

Nun, Zeilenumbrüche innerhalb eines Feldwertes durch Leerschläge zu ersetzen widerspricht der RFC 4180 ja nicht. Der Korrektness wegen habe ich es nun aber doch so gelöst, dass ich entsprechende Werte mit Anführungszeichen umschliesse, um den Zeilenumbruch als Teil des Feldwertes zu kennzeichnen.

D
985 Beiträge seit 2014
vor 7 Jahren

Nun, Zeilenumbrüche innerhalb eines Feldwertes durch Leerschläge zu ersetzen widerspricht der RFC 4180 ja nicht.

Das hat ja auch nichts mit RFC 4180 zu tun. Der Feldinhalt kann beliebig sein. Die RFC 4180 regelt nur, wie der dann in der CSV abgebildet werden soll.