2009-03-28 10 views
1

J'ai un fichier. Lorsque je l'ouvre dans le Bloc-notes, je vois des personnages dans une seule ligne. Cependant, si j'ouvre ce fichier dans une autre application comme WordPad ou Notepad++. Je peux voir des sauts de ligne irréguliers entre les charachters et ils apparaissent dans plusieurs lignes. Ces sauts de ligne apparaît également si je le fais reader.Readline(). Comment puis-je effectuer Notepad comme la lecture de ligne en C#?C# fichier semblable au bloc-notes lu

Répondre

2

Désolé pour la deuxième réponse de ma part, mais je viens de réaliser que vous pouvez utiliser pour obtenir PEEK caractère suivant et vérifier si le courant et suivant sont \ r \ n, comme ceci:

var path = "c:/test.txt"; 

File.WriteAllText(path, "a\nb\r\nc"); 

using (var stream = File.OpenRead(path)) 
using (var reader = new StreamReader(stream, Encoding.ASCII)) 
{ 
    var lineBuilder = new StringBuilder(); 
    string line; 
    char currentChar; 
    int nextChar; 
    while (!reader.EndOfStream) 
    { 
     currentChar = (char)reader.Read(); 
     nextChar = reader.Peek(); 

     if (!(currentChar == '\r' && nextChar == '\n')) 
     { 
      lineBuilder.Append(currentChar); 
     } 

     if((currentChar == '\r' && nextChar == '\n') || nextChar == -1) 
     { 
      line = lineBuilder.ToString(); 
      Console.WriteLine(line); 

      lineBuilder = new StringBuilder(); 

      reader.Read(); 
     } 
    } 
} 
+0

Merci pour votre travail –

4

De telles différences sont généralement dues à l'ambiguïté de l'encodage du fichier. Si vous voulez que le fichier soit analysé correctement, vous devrez utiliser le bon encodage. Quels personnages causent des problèmes? De plus - si les octets ne sont pas légales dans le codage utilisé, tous les paris sont ouverts ;-P

Vous pouvez spécifier l'encodage lors de la création (par exemple) un StreamReader sur le fichier:

using (Stream stream = File.OpenRead(path)) 
    using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) 
    { 
     string line; 
     while ((line = reader.ReadLine()) != null) 
     { 
      Console.WriteLine(line); 
     } 
    } 

Avec la base-64 affichée, le problème est le \r au milieu de la ligne. Pour lire cela comme une chaîne de base, vous pouvez utiliser:

byte[] data = File.ReadAllBytes(path); 
string txt = Encoding.UTF8.GetString(data); 

ou tout simplement:

string text = File.ReadAllText("foo.txt"); 

Cependant, vous aurez toujours des difficultés à afficher cela. Vous pouvez maintenant Split sur votre choisi fin de ligne (crlf vraisemblablement). StreamReader est fractionnement sur tout ce qui ressemble comme une fin de ligne.

string[] lines = s.Split(new string[] {"\r\n"}, StringSplitOptions.None); 
+0

J'ai essayé tout type de codage défini pour ce fichier, chacun se brise la ligne en deux, Son seul bloc-notes où je le vois comme une seule ligne, souhaite que je pourrais joindre fichier ici. –

+0

En effet. Cela ressemble à quelque chose d'intéressant dans les octets sous-jacents du fichier. Est-ce gros? Vous pouvez poster l'hexagone/base 64 représentation ... –

+0

MjAwOTAzMDR8RVVST3x8MDAwMDJ8RkZGRnwgfEF8U3w3MTB8TUxJICAgfCB8fA0gIHwgLjAwMDAwfCAuMDAwMDB8LjAwMDAwfDIwMDkwMzA0IDA4OjMxOjIzOjYxQU18IHwgfCB8IHwgICAgfHwgICAgfCB8LjAwfCAgIA == –

0

Si ce n'est pas critique vous pouvez simplement charger tout le texte et divisé en lignes en utilisant une expression régulière ou quelque chose,

var path = "c:/test.txt"; 

File.AppendAllText(path, "lala\nlala\nlalal"); 
var text = File.ReadAllText(path); 

Console.WriteLine(Regex.Split(text, Environment.NewLine).Length); 
+0

Taille du fichier sont dans les concerts, donc je ne peux pas faire ReadAllText –

0

utilisez

String[] lines = File.ReadAllLines("c:\\text.txt"); 

Pour extraire toutes les lignes d'un seul coup

Questions connexes