web-dev-qa-db-fra.com

Fractionner le texte avec '\ r\n'

Je suivais cet article article

Et je suis venu avec ce code:

string FileName = "C:\\test.txt";

using (StreamReader sr = new StreamReader(FileName, Encoding.Default))
{
    string[] stringSeparators = new string[] { "\r\n" };
    string text = sr.ReadToEnd();
    string[] lines = text.Split(stringSeparators, StringSplitOptions.None);
    foreach (string s in lines)
    {
        Console.WriteLine(s);
    }
}

Voici le texte d'exemple: 

somet interesting text\n
some text that should be in the same line\r\n
some text should be in another line

Voici la sortie:

somet interesting text\r\n
some text that should be in the same line\r\n
some text should be in another line\r\n

Mais ce que je veux, c'est ceci:

somet interesting textsome text that should be in the same line\r\n
some text should be in another line\r\n

Je pense que je devrais obtenir ce résultat mais quelque part me manque quelque chose ...

32
skmasq

Le problème ne vient pas de la scission, mais plutôt de la WriteLine. Un \n dans une chaîne imprimée avec WriteLine produira une ligne "extra".

Exemple

var text = 
  "somet interesting text\n" +
  "some text that should be in the same line\r\n" +
  "some text should be in another line";

string[] stringSeparators = new string[] { "\r\n" };
string[] lines = text.Split(stringSeparators, StringSplitOptions.None);
Console.WriteLine("Nr. Of items in list: " + lines.Length); // 2 lines
foreach (string s in lines)
{
   Console.WriteLine(s); //But will print 3 lines in total.
}

Pour résoudre le problème, supprimez \n avant d’imprimer la chaîne.

Console.WriteLine(s.Replace("\n", ""));
44
Magnus

Cela a fonctionné pour moi.

using System.IO;

//  

    string readStr = File.ReadAllText(file.FullName);          
    string[] read = readStr.Split(new char[] {'\r','\n'},StringSplitOptions.RemoveEmptyEntries);
4
Chinnawat Sirima

Je pense que le problème est dans votre fichier texte. Il est probablement déjà divisé en trop de lignes et lorsque vous le lisez, il "ajoute" des caractères supplémentaires \r et/ou \n (tels qu'ils existent dans le fichier). Vérifiez votre contenu dans la variable text.

Le code ci-dessous (sur une variable locale avec votre texte) fonctionne bien et se divise en 2 lignes:

string[] stringSeparators = new string[] { "\r\n" };
string text = "somet interesting text\nsome text that should be in the same line\r\nsome text should be in another line";
string[] lines = text.Split(stringSeparators, StringSplitOptions.None);
3
Szymon

J'ai adopté une approche plus compacte pour scinder une entrée résultant d'une zone de texte en une liste de chaînes. Vous pouvez l'utiliser si cela vous convient.

le problème est que vous ne pouvez pas séparer par\r\n, donc j’ai préalablement supprimé le\n et que je ne l’ai divisé que par\r

var serials = model.List.Replace("\n","").Split('\r').ToList<string>();

J'aime cette approche parce que vous pouvez le faire en une seule ligne. 

2
Adrian Hedley

La lecture du fichier s’effectue plus facilement avec la classe statique File:

// First read all the text into a single string.
string text = File.ReadAllText(FileName);

// Then split the lines at "\r\n".   
string[] stringSeparators = new string[] { "\r\n" };
string[] lines = text.Split(stringSeparators, StringSplitOptions.None);

// Finally replace lonely '\r' and '\n' by  whitespaces in each line.
foreach (string s in lines) {
    Console.WriteLine(s.Replace('\r', ' ').Replace('\n', ' '));
}

Remarque: le texte peut également contenir des tabulatrices verticales \v. Celles-ci sont utilisées par Microsoft Word comme des sauts de ligne manuels.

Afin d’attraper tout type de pauses, vous pouvez utiliser regex pour le remplacement

Console.WriteLine(Regex.Replace(s, @"[\f\n\r\t\v]", " "));

Cela a fonctionné pour moi.

string stringSeparators = "\r\n";
string text = sr.ReadToEnd();
string lines = text.Replace(stringSeparators, "");
lines = lines.Replace("\\r\\n", "\r\n");
Console.WriteLine(lines);

Le premier remplacement remplace le \r\n à partir des nouvelles lignes du fichier texte et le second remplace le texte actuel \r\n qui est converti en \\r\\n lors de la lecture des fichiers. (Lorsque le fichier est lu, \ devient \\).

1
davidsbro

Le code suivant donne les résultats escomptés.

string text="some interesting text\nsome text that should be in the same line\r\nsome 
text should be in another line"
var results = text.Split(new[] {"\n","\r\n"}, StringSplitOptions.None);
0
user3472484