Comment lire un fichier dans une chaîne avec CR/LF-elle préservée?
Si j'ai posé la question "comment lire un fichier dans une chaîne", la réponse serait évidente. Néanmoins, voici les captures avec CR/LF préservé.
Le problème est, File.ReadAllText
bandes de ces personnages. StreamReader.ReadToEnd
juste converti LF en CR pour moi, ce qui a conduit à longue enquête où j'ai un bug assez évident code 😉
Donc, en résumé, si j'ai un fichier contenant foo\n\r\nbar
je voudrais obtenir foo\n\r\nbar
(c'est à dire exactement le même contenu), pas foo bar
, foobar
, ou foo\n\n\nbar
. Est-il prêt à utiliser .Net espace?
Le résultat doit être toujours seule chaîne de caractères contenant le fichier en entier.
Pourquoi ne pas vous traiter comme
Pas sûr.. mais,
quelque chose comme
Non exigence d'une norme standard de routine, ne fonctionne pas, n'est pas une surprise est-il? Vous avez dit le Texte, il fait ce que vous avez dit.
byte[]
? Fichier.ReadAllBytes etcPas sûr.. mais,
\n\r\n
de saut de Ligne est - retour Chariot - saut de Ligne. Alors, quand il est lu dans.. les chances sont que c'est juste la suppression de votre balançant saut de ligne au début en faveur du retour Chariot - saut de Ligne combinaison. Je ne suis pas vraiment un expert sur le fonctionnement interne de .NET StreamReader si 🙁quelque chose comme
new string(System.IO.File.ReadAllBytes(filename).Select(b => (char)b).ToArray())
? Quelque part encore \n
est converti de toute façon, je vais enquêter davantage.Non exigence d'une norme standard de routine, ne fonctionne pas, n'est pas une surprise est-il? Vous avez dit le Texte, il fait ce que vous avez dit.
OriginalL'auteur greenoldman | 2012-11-22
Vous devez vous connecter pour publier un commentaire.
Êtes-vous sûr que ces méthodes sont les coupables qui sont le décapage de vos personnages?
J'ai essayé d'écrire un test rapide;
StreamReader.ReadToEnd
conserve tous les caractères de saut de ligne.Un résultat identique est obtenu lors de l'écriture et de la lecture à partir d'un fichier temporaire:
Il semble que vos retours à la ligne sont de se perdre ailleurs.
Heureux que vous avez trouvé la cause 🙂
OriginalL'auteur Douglas
Ce bout de code va préserver RC et CR
OriginalL'auteur Jesper
Il prend deux sauts. Premier est le Fichier.ReadAllBytes() pour obtenir tous les octets dans le fichier. Ce qui ne veut pas essayer de traduire quoi que ce soit, vous obtenez les données brutes du fichier afin de le weirdo ligne terminaisons sont conservées en tant que-est.
Mais octets, vous avez demandé une chaîne de caractères. De sorte que la deuxième hop, c'est d'appliquer le Codage.GetString() pour convertir les octets d'une chaîne de caractères. La seule chose que vous avez à faire est de choisir le bon Encodage de la classe, celui qui correspond à l'encodage utilisé par le programme qui a écrit le fichier. Étant donné que le fichier est assez foiré si elle contient
\n\r\n
séquences, et vous n'avez pas de document autre chose à propos de fichier, votre meilleur pari est d'utiliser l'Encodage.Par défaut. Ajuster si nécessaire.Haut supposition, si vous n'avez pas encore rencontré EBCDIC. Pas le moment, que entre ces caractères de contrôle ASCII questions.
est le point de l'ensemble. Si l'OP est l'utilisation de tout ASCII compatible encoding (y compris UTF-8), alors il ne sera pas question ce qui est entre les caractères de contrôle; multi-séquences d'octets ne peut pas contenir de valeurs de 10 et 13 ans. Oui, à l'aide d'un non-ASCII compatible encoding comme EBCDIC (ou même UTF-16) permettrait d'introduire toute une série de nouvelles questions, mais je suppose que l'OP aurait parlé si elles l'étaient.
Alors que pour cette question, il a été mon erreur enterré à l'intérieur du code, j'aime bien ton explication et la description des étapes -- je vous remercie beaucoup!
OriginalL'auteur Hans Passant
Vous pouvez lire le contenu d'un fichier à l'aide de
File.ReadAllLines
, qui retournera un tableau de lignes. Ensuite, utilisezString.Join
de fusionner les lignes à l'aide d'un séparateur.Noter que ce sera perdre la précision de la ligne de terminaison des caractères. Par exemple, si les lignes de fin que dans
\n
ou\r
, la chaîne résultanteallLines
seront les ont remplacés par des\r\n
ligne terminateurs.Il y a bien sûr d'autres façons d'y parvenir, et ce sans perdre le vrai EOL terminator, cependant
ReadAllLines
est à portée de main en ce qu'il permet de détecter de nombreux types de codage de texte par lui-même, et il prend également en très peu de lignes de code.OriginalL'auteur user1695736
ReadAllText ne retourne pas de retour chariot.
À partir de MSDN - https://msdn.microsoft.com/en-us/library/ms143368(v=vs. 110).aspx
OriginalL'auteur pitiklan
Ceci est similaire à la accepté de répondre, mais je voulais être plus au point.
sr.ReadToEnd()
va lire les octets comme est souhaitée:Vous pourriez même aussi ceux en cascade
using
consolidés. Mais je voulais décrire la façon dont la façon dont vous écrivez dans ce fichier, en premier lieu, permettra de déterminer comment lire le contenu de lamyEvents
chaîne, et peut-être où se trouve le problème. J'ai écrit à mon fichier comme ceci:Ensuite, j'ai pu utiliser le code plus loin ci-dessus pour obtenir la chaîne de caractères du contenu. Parce que j'étais d'aller plus loin et de chercher les cordes, j'ai mis ce code après QUE le code, là-haut:
Et cela a bien fonctionné. Donc, je sais que
myEvents
a duEnvironment.NewLine
caractères conservés parce que j'ai été capable de le remplacer avec(char)2660
et faire un.Split()
sur cette chaîne à l'aide de ce personnage à la diviser en segments individuels.OriginalL'auteur vapcguy