So Lesen Sie eine Datei in einen string mit CR/LF erhalten?
Wenn ich die Frage gestellt: wie liest man eine Datei in einen string" wäre die Antwort offensichtlich. Aber-hier ist der Haken mit CR/LF erhalten.
Das problem ist, dass File.ReadAllText
Streifen die Charaktere. StreamReader.ReadToEnd
gerade umgebaut LF in CR für mich, das führte zu langen Untersuchung, wo habe ich Fehler in ziemlich offensichtlich, code 😉
Also, kurz gesagt, wenn ich die Datei mit foo\n\r\nbar
ich möchte foo\n\r\nbar
(also genau den gleichen Inhalt haben), nicht foo bar
, foobar
oder foo\n\n\nbar
. Gibt es etwas, bereit zu verwenden, Weg .Net-space?
Das Ergebnis sollte immer eine einzige Zeichenfolge, mit gesamte Datei.
- Warum gehst du nicht einfach behandeln es als
byte[]
? Datei.ReadAllBytes etc - Nicht sicher.. aber
\n\r\n
ist Line feed - Wagenrücklauf - Zeilenvorschub. So, wenn es zu Lesen in.. die Chancen sind es nur entfernen Sie Ihre baumelnden line feed am start zugunsten der Wagenrücklauf - Zeilenvorschub-Kombination. Ich bin nicht wirklich ein Experte für das Innenleben .NET StreamReader allerdings 🙁 - so etwas wie
new string(System.IO.File.ReadAllBytes(filename).Select(b => (char)b).ToArray())
? Irgendwo noch\n
ist sowieso bekehren, werde ich haben, um es zu untersuchen weiter. - Nicht-standard-Anforderung mit standard-routine, nicht Arbeit, ist das nicht eine überraschung ist es? Sie sagte, der Text, es Tat, was Sie sagte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie sicher, dass diejenigen Methoden, die Schuldigen, die Strippen aus Ihrem Zeichen?
Habe ich versucht zu schreiben, einen quick-test;
StreamReader.ReadToEnd
behält alle neue-Zeile-Zeichen.Identische Ergebnis wird erzielt, wenn schreiben und Lesen aus einer temporären Datei:
Scheint es, dass Ihre Zeilenumbrüche verloren gehen anderswo.
Dieses Stück code wird beibehalten, LR und CR
Dauert es zwei hops. Erste ist die Datei.ReadAllBytes (), um alle bytes in der Datei. Was nicht zu übersetzen versuchen alles, Sie bekommen die raw-Daten in der Datei, so die weirdo-line-Endungen erhalten sind, wie Sie sind.
Aber, dass die bytes, fragte Sie nach einer Zeichenfolge. So zweite hop zu gelten-Codierung.GetString() zu konvertieren, die bytes zu einem string. Die eine Sache, die Sie tun müssen, ist wählen Sie die richtigen Encoding-Klasse, die eine, die passt die Codierung vom Programm verwendet, schrieb die Datei. Da die Datei ist ziemlich versaut, wenn es enthält
\n\r\n
- Sequenzen, und Sie hat nicht Dokument etwas über die Datei, ist Ihre beste Wette ist, um die Verwendung der Kodierung.Standard. Tweak wie erforderlich.Lesen Sie den Inhalt einer Datei mit
File.ReadAllLines
, die Rückgabe ist ein array mit den Zeilen. Dann nutzen SieString.Join
Zusammenführen der Linien zusammen mit einem separator.Beachten Sie, dass dieser verliert die Präzision, mit der das aktuelle line terminator-Zeichen. Zum Beispiel, wenn die Zeilen enden in nur
\n
oder\r
, die resultierende ZeichenfolgeallLines
ersetzt haben werden Sie mit\r\n
Zeilenende-Zeichen.Natürlich gibt es auch andere Wege führen zum ohne dabei die wahre EOL-terminator, aber
ReadAllLines
ist praktisch, denn es kann erkennen, viele Arten von text-Kodierung von selbst, und es nimmt auch nur sehr wenige Zeilen code.ReadAllText nicht zurück Wagen zurück.
Vom MSDN - https://msdn.microsoft.com/en-us/library/ms143368(v=vs. 110).aspx
Dies ist ähnlich wie die akzeptierte Antwort, wollte aber mehr auf den Punkt.
sr.ReadToEnd()
liest die bytes wie gewünscht:Könnte man sogar auch diejenigen, die in kaskadierten
using
Aussagen. Aber ich wollte beschreiben, wie die Weise, die Sie schreiben, die Datei in Erster Linie wird bestimmen, wie zu Lesen, die Inhalte aus dermyEvents
string, und vielleicht wirklich, wo das problem liegt. Ich schrieb an meine Datei wie folgt:Dann könnte ich mit dem code weiter oben, den string von den Inhalten. Denn ich ging weiter und suchen für die einzelnen Saiten, ich habe diese code nach dem code da oben:
- Und das funktionierte gut. Also ich weiß, dass
myEvents
musste dieEnvironment.NewLine
Zeichen erhalten, weil ich war in der Lage, es zu ersetzen mit(char)2660
und eine.Split()
auf, dass der string mit diesem Zeichen teilen Sie es in den einzelnen Segmenten.