Ich muss eine Zeichenfolge in .NET in Zeilenumbrüche aufteilen. Die einzige Möglichkeit, Zeichenfolgen aufzuteilen, ist die Split- Methode. Dadurch kann ich mich jedoch nicht (leicht) in eine neue Zeile aufteilen. Was ist also der beste Weg, dies zu tun?
806
Antworten:
Um einen String zu teilen, müssen Sie die Überladung verwenden, die ein Array von Strings benötigt:
Bearbeiten:
Wenn Sie verschiedene Arten von Zeilenumbrüchen in einem Text verarbeiten möchten, können Sie die Möglichkeit verwenden, mehr als eine Zeichenfolge abzugleichen. Dadurch werden beide Zeilenumbrüche korrekt aufgeteilt und leere Zeilen und Abstände im Text beibehalten:
quelle
Environment.NewLine
Eigenschaft enthält den Standard-Zeilenumbruch für das System. Für ein Windows-System wird es zum Beispiel sein"\r\n"
.\n
Verlassen eines\r
am Ende jeder Zeile aufteilt und dann die Zeilen mit einem\r\n
dazwischen ausgibt .\r
und\n
Escape (unter anderem) haben für den C # -Compiler eine besondere Bedeutung. VB hat diese Escape-Sequenzen nicht, daher werden stattdessen diese Konstanten verwendet.Was ist mit einem
StringReader
?quelle
while
Schleife, die zu dieser Antwort hinzugefügt werden sollte.Sie sollten in der Lage sein, Ihre Saite ziemlich einfach zu teilen, wie folgt:
quelle
Vermeiden Sie die Verwendung von string.Split für eine allgemeine Lösung, da Sie überall dort, wo Sie die Funktion verwenden, mehr Speicher verwenden - die ursprüngliche Zeichenfolge und die geteilte Kopie, beide im Speicher. Vertrauen Sie mir, dass dies ein verdammt großes Problem sein kann, wenn Sie mit der Skalierung beginnen. Führen Sie eine 32-Bit-Stapelverarbeitungs-App aus, die 100-MB-Dokumente verarbeitet, und Sie werden auf acht gleichzeitige Threads verzichten. Nicht dass ich schon einmal dort gewesen wäre ...
Verwenden Sie stattdessen einen solchen Iterator.
Auf diese Weise können Sie eine speichereffizientere Schleife um Ihre Daten durchführen.
Wenn Sie alles im Speicher haben möchten, können Sie dies natürlich tun.
quelle
blah.SplitToLines..
zdocument.SplitToLines...
.this
die formalen Parameter ein, was es zu einer Erweiterungsmethode macht.Verwenden Sie basierend auf Guffas Antwort in einer Erweiterungsklasse:
quelle
Für eine Zeichenfolgenvariable
s
:Dies verwendet die Definition der Zeilenenden in Ihrer Umgebung. Unter Windows sind die Zeilenenden CR-LF (Wagenrücklauf, Zeilenvorschub) oder die Escapezeichen von C #
\r\n
.Dies ist eine zuverlässige Lösung, denn wenn Sie die Zeilen mit neu kombinieren
String.Join
, entspricht dies Ihrer ursprünglichen Zeichenfolge:Was nicht zu tun ist:
StringSplitOptions.RemoveEmptyEntries
diese Option , da dadurch Markups wie Markdown unterbrochen werden, bei denen leere Zeilen einen syntaktischen Zweck haben.new char[]{Environment.NewLine}
, da unter Windows ein leeres Zeichenfolgenelement für jede neue Zeile erstellt wird.quelle
Regex ist auch eine Option:
quelle
"\r?\n"
.Ich dachte nur, ich würde meine zwei Bits hinzufügen, weil die anderen Lösungen für diese Frage nicht in die wiederverwendbare Codeklassifizierung fallen und nicht bequem sind.
Der folgende Codeblock erweitert das
string
Objekt so, dass es als natürliche Methode beim Arbeiten mit Zeichenfolgen verfügbar ist.Sie können die
.Split()
Funktion jetzt aus einer beliebigen Zeichenfolge wie folgt verwenden:Um ein Zeilenumbruchzeichen aufzuteilen, übergeben Sie einfach
"\n"
oder"\r\n"
als Begrenzerparameter.Kommentar: Es wäre schön, wenn Microsoft diese Überlastung implementieren würde.
quelle
Environment.Newline
ist der harten Codierung entweder\n
oder vorzuziehen\r\n
.Environment.Newline
dient der plattformübergreifenden Kompatibilität und nicht der Arbeit mit Dateien, die andere Leitungsabschlüsse als das aktuelle Betriebssystem verwenden. Weitere Informationen finden Sie hier. Es hängt also wirklich davon ab, mit was der Entwickler arbeitet. Durch die Verwendung von wirdEnvironment.Newline
sichergestellt, dass der Zeilenrückgabetyp zwischen den Betriebssystemen nicht konsistent ist. Durch die Hardcodierung erhält der Entwickler die volle Kontrolle..Newline
ist keine Zauberei, unter der Haube sind es nur die oben angegebenen Zeichenfolgen, basierend auf einem Schalter, ob es unter Unix oder unter Windows läuft. Am sichersten ist es, zuerst einen String-Ersatz für alle "\ r \ n" durchzuführen und dann auf "\ n" aufzuteilen. Wenn die Verwendung.Newline
fehlschlägt, arbeiten Sie mit Dateien, die von anderen Programmen gespeichert wurden, die eine andere Methode für Zeilenumbrüche verwenden. Es funktioniert gut, wenn Sie wissen, dass beim Lesen der Datei immer die Zeilenumbrüche Ihres aktuellen Betriebssystems verwendet werden.foo = foo.Replace("\r\n", "\n"); string[] result = foo.Split('\n');
. Verstehe ich richtig, dass dies auf allen Plattformen funktioniert?Ich verwende derzeit diese Funktion (basierend auf anderen Antworten) in VB.NET:
Es wird versucht, zuerst die plattformlokale Newline aufzuteilen und dann auf jede mögliche Newline zurückzugreifen.
Ich habe das bisher nur in einer Klasse gebraucht. Wenn sich das ändert, werde ich dies wahrscheinlich machen
Public
und es in eine Utility-Klasse verschieben und es vielleicht sogar zu einer Erweiterungsmethode machen.Hier erfahren Sie, wie Sie die Zeilen wieder zusammenfügen können:
quelle
"\r"
= zurück."\r\n"
= return + neue Zeile. (Bitte überprüfen Sie diesen Beitrag und die akzeptierte Lösung hierNun, eigentlich sollte Split reichen:
quelle
Die Option RemoveEmptyStrings stellt sicher, dass Sie keine leeren Einträge haben, da \ n einem \ r folgt
(Bearbeiten, um Kommentare wiederzugeben :) Beachten Sie, dass auch echte Leerzeilen im Text verworfen werden. Dies ist normalerweise das, was ich möchte, aber es ist möglicherweise nicht Ihre Anforderung.
quelle
Ich wusste nichts über Environment.Newline, aber ich denke, dies ist eine sehr gute Lösung.
Mein Versuch wäre gewesen:
Das zusätzliche .Trim entfernt alle \ r oder \ n, die möglicherweise noch vorhanden sind (z. B. unter Windows, aber Teilen einer Zeichenfolge mit OS x Newline-Zeichen). Wahrscheinlich nicht die schnellste Methode.
BEARBEITEN:
Wie in den Kommentaren richtig hervorgehoben, werden dadurch auch Leerzeichen am Zeilenanfang oder vor dem neuen Zeilenvorschub entfernt. Wenn Sie dieses Leerzeichen beibehalten müssen, verwenden Sie eine der anderen Optionen.
quelle
Dumme Antwort: Schreiben Sie in eine temporäre Datei, damit Sie den Ehrwürdigen verwenden können
File.ReadLines
quelle
var
, da es den Variablentyp nicht definiert, sodass Sie möglicherweise nicht verstehen, wie dieses Objekt verwendet wird oder was dieses Objekt darstellt. Außerdem zeigt dies das Schreiben der Zeilen und gibt nicht einmal einen Dateinamen an, sodass ich bezweifle, dass dies funktionieren würde. Beim Lesen wird dann der Pfad zur Datei erneut nicht angegeben. Vorausgesetzt, daspath
istC:\Temp\test.txt
, sollten Sie dann habenstring[] lines = File.ReadLines(path);
.Path.GetTempFileName
msdn.microsoft.com/en-us/library/… nachgeschlagen und es heißt, es wird eine Null-Byte-Datei erstellt und "der vollständige Pfad dieser Datei" zurückgegeben. Ich könnte schwören, dass ich das schon einmal versucht habe und es eine Ausnahme gab, weil es keine Datei gefunden hat, sondern stattdessen einen Ordnerspeicherort zurückgegeben hat. Ich kenne die Argumente für die Verwendungvar
, aber ich würde sagen, es wird NICHT empfohlen, da es nicht zeigt, was das variable Objekt ist. Es verschleiert es.quelle
Eigentlich sehr einfach.
VB.NET:
C #:
quelle
Environment.NewLine
genau wie in VB.