2010-08-26 9 views
2

je vais lire un fichier de mon ordinateur à l'aideComment couper les caractères illégaux d'une chaîne

StreamReader sr = new StreamReader(FileName); 

      string str = sr.ReadToEnd(); 

Dans ce que je reçois des caractères illégaux comme/n,/r et un autre.

Je voudrais remplacer les caractères non autorisés par un caractère vide. J'ai essayé de faire un tableau de caractères, mais je ne l'ai pas en mesure d'éliminer ces si quelqu'un peut me aider

+2

Vous savez probablement que/r/n fait référence à un saut de ligne? – Rushyo

Répondre

3
string str = string.Join(string.Empty, File.ReadAllLines(FileName)); 
+0

Cela sonne bien. Pouvez-vous expliquer comment il supprime tous ces caractères illégaux – Dotnet

+0

@Dorababu, tout ce que cela fait est de dépouiller les nouvelles lignes (\ r \ n) d'un fichier. Je ne sais pas ce que tu veux dire par caractères illégaux car les nouvelles lignes ne sont pas des caractères illégaux mais j'avais l'impression que tu cherchais à déshabiller un fichier alors j'ai proposé cette solution. –

+0

ok merci pour la solution – Dotnet

5

Vous pouvez utiliser la méthode String.Replace:

string str = sr.ReadToEnd().Replace("\r", "").Replace("\n", ""); 

Cependant ce n'est pas une très bonne idée si la chaîne est long et vous avez une longue liste de caractères illégaux, car chaque appel à Replace va créer une nouvelle instance de String. Une meilleure option serait de filtrer les caractères illégaux LINQ:

char[] illegalChars = new[] { '\r', '\n' }; // add other illegal chars if needed 
char[] chars = sr.ReadToEnd().Where(c => !illegalChars.Contains(c)).ToArray(); 
string str = new String(chars); 

Cependant l'appel à Contains ajoute les frais généraux, il est plus rapide de tester directement contre chaque caractère illégal:

char[] chars = sr.ReadToEnd().Where(c => c != '\r' && c != '\n').ToArray(); 
string str = new String(chars); 

Et pour être complet , voici une version encore plus rapide:

StringBuilder sb = new StringBuilder(); 
foreach(char c in sr.ReadToEnd()) 
{ 
    if (c != '\r' && c != '\n') 
     sb.Append(c); 
} 
string str = sb.ToString(); 
+0

@Developer Art, je sais, je modifiais déjà ma réponse –

+0

Cela semble très créatif, mais la performance avec LINQing va souffrir. –

+0

sr.readtoend() où cela n'existe pas, alors comment puis-je appeler cela – Dotnet

3
StreamReader sr = new StreamReader (FileName); 

StringBuilder sb = new StringBuilder (sr.ReadToEnd()); 

sb.Replace ("\r\n", String.Empty); 
sb.Replace ("\n", String.Empty); 

string hereIsYourString = sb.ToString(); 
+0

Vous devriez utiliser 'String.Empty' au lieu de' "" ' – Scoregraphic

+0

Oui, d'accord, cela semblera plus propre. –

+0

Le problème avec Replace est que StringBuilder déplace constamment les caractères dans son tampon. Il est beaucoup plus rapide de pré-filtrer les caractères et de les ajouter au StringBuilder un par un. –