Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
string.replace funktioniert nicht (=>falscher Umgang mit Strings)
MrChangeLog
myCSharp.de - Member

Avatar #avatar-4086.gif


Dabei seit:
Beiträge: 121

Themenstarter:

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

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
BhaaL
myCSharp.de - Member

Avatar #erP6yAFiewXrJTqrvg6R.jpg


Dabei seit:
Beiträge: 654

beantworten | zitieren | melden

Strings sind immutable. Replace gibt den geänderten String zurück, den du aktuell ignorierst.
private Nachricht | Beiträge des Benutzers
holliesoft
myCSharp.de - Member



Dabei seit:
Beiträge: 18
Herkunft: Bad Kreuznach

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
MrChangeLog
myCSharp.de - Member

Avatar #avatar-4086.gif


Dabei seit:
Beiträge: 121

Themenstarter:

beantworten | zitieren | melden

@BhaaL: jup, daran lag's.
Zitat von holliesoft

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

Gruß
Patrick

Stimmt
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 985

beantworten | zitieren | melden

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).
private Nachricht | Beiträge des Benutzers
MrChangeLog
myCSharp.de - Member

Avatar #avatar-4086.gif


Dabei seit:
Beiträge: 121

Themenstarter:

beantworten | zitieren | melden

Zitat von Sir Rufo

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?
private Nachricht | Beiträge des Benutzers
hypersurf
myCSharp.de - Member



Dabei seit:
Beiträge: 520
Herkunft: Münster

beantworten | zitieren | melden

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

Siehe auch [erledigt] Zeilenumbruch innerhalb eines CSV Elements
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 985

beantworten | zitieren | melden

Man lese dazu RFC 4180: Common Format and MIME Type for Comma-Separated Values (CSV) Files.
private Nachricht | Beiträge des Benutzers
MrChangeLog
myCSharp.de - Member

Avatar #avatar-4086.gif


Dabei seit:
Beiträge: 121

Themenstarter:

beantworten | zitieren | melden

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?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von MrChangeLog am .
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 985

beantworten | zitieren | melden

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)
Zitat von MrChangeLog
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.
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Deaktiviertes Profil am .
private Nachricht | Beiträge des Benutzers
MrChangeLog
myCSharp.de - Member

Avatar #avatar-4086.gif


Dabei seit:
Beiträge: 121

Themenstarter:

beantworten | zitieren | melden

@Sir Rufo: danke für die Ausführung, das Ausführung und den Link, das war sehr aufschlussreich
Zitat von Sir Rufo
Zitat von MrChangeLog
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.
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 985

beantworten | zitieren | melden

Zitat von MrChangeLog
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.
private Nachricht | Beiträge des Benutzers