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 ...
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", ""));
Cela a fonctionné pour moi.
using System.IO;
//
string readStr = File.ReadAllText(file.FullName);
string[] read = readStr.Split(new char[] {'\r','\n'},StringSplitOptions.RemoveEmptyEntries);
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);
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.
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 \\
).
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);