J'ai la tâche de faire la première ligne en majuscules et dans le reste, chaque mot de 3 caractères ou plus commence par des majuscules.
Je le teste dans la console donc il est fait en partie avec streamreader / streamwriter, mais quand il fonctionne bien je le corrigerai.
Le problème est que la Console.WriteLine (); avant boucle for avec elle, elle fait une ligne vide après la première ligne mais sans ça, ça ne fait pas la 3e ligne. Le texte d'entrée ressemble à ceci
using System; using System.IO; namespace priklad_8._4 { class Program { static void Main(string[] args) { firstUpper(@"aaa.txt", @"new.txt"); Console.ReadLine(); } static void firstUpper(String from, String to) { StreamReader sr = new StreamReader(from); StreamWriter sw = new StreamWriter(to); String s; int length = 0; char[] pole = new char[100]; char dd = 'A'; while ((s = sr.ReadLine()) != null) { if (length == 0) { Console.WriteLine(s.ToUpper()); length++; } else { String[] ss = s.Trim(' ').Split(' '); Console.WriteLine(); for (int i = 0; i < ss.Length; i++) { if (ss[i].Length >= 3) { String ds = ss[i]; char[] das = ds.ToCharArray(); Console.Write(Char.ToUpper(das[0]) + ds.Substring(1) + " "); if ((int)dd == 10) { Console.WriteLine(); } } else Console.Write(ss[i] + " "); } } } sw.Close(); sr.Close(); } } }
avec la WriteLine, cela se termine comme suit:
TITLE OF TEXT Sssssss ss Ssss, ss Sssssss Ddddd Ddd Ddddd Dddddd
et sans: p>
TITLE OF TEXT sssssss ss ssss, ss sssssss ddddd ddd ddddd dddddd
Je pense que je l'ai rendu trop compliqué et que je me suis un peu perdu alors je cherche la solution à ce petit problème ou aussi pour rendre ce code plus facile mais ce n'est pas le but pour le moment.
title of text sssssss ss ssss, ss sssssss ddddd ddd ddddd dddddd
Merci!
3 Réponses :
Si vous voulez laisser tout le reste tel quel, au lieu de
Console.Write(s.ToUpper())
utilisez ceci:
Console.WriteLine(s.ToUpper());
Oh merci, si simple mais j'étais vraiment perdu dans le code. Je vais également réécrire le code et le rendre plus organisé pour mieux le comprendre comme @aweyeagdawg l'a mentionné
Juste pour vous expliquer plus en détail pourquoi: dans le cas où c'était la première ligne, vous atteigniez la Console.Writeline (s.ToUpper ())
dans votre if. Et deuxième itération, vous atteigniez la Console.Writeline ()
juste au début de votre autre. C'est pourquoi vous avez 2 nouvelles lignes. Oui, refactorisez votre code. et n'hésitez pas à utiliser des points d'arrêt, car je pense que cela vous aurait aidé à trouver ceci
Effectuez cela. Quelques conseils: supprimez les éléments redondants; peut-être utiliser bool
pour vérifier si c'est la première ligne, au lieu de int
; ne pas convertir en tableau char
, vous pouvez accéder directement aux caractères de la chaîne avec l'opérateur []
: Char.ToUpper (ds [0]);
Peut-être un moyen plus propre d'y arriver:
using (var input = new StreamReader("input.txt")) { var currentLine = 0; while (!input.EndOfStream) { var line = input.ReadLine() ?? ""; if (++currentLine == 1) { // first line is upper case Console.WriteLine(line.ToUpper()); } else { // Every word longer than 3 letter starts with capitalized Console.WriteLine(Regex.Replace(line, @"\w{3,}", (match) => CultureInfo.CurrentCulture .TextInfo.ToTitleCase(match.Value.ToLower()))); } } }
Une autre façon plus propre d'y arriver en utilisant File.ReadAllLines et File.WriteAllLines
static void Run(string fromFile, string toFile) { File.WriteAllLines(toFile, File.ReadAllLines(fromFile).Select((line, index) => index == 0 ? line.ToUpper() : Regex.Replace(line, @"\w{3,}", (match) => CultureInfo.CurrentCulture.TextInfo.ToTitleCase(match.Value)))); }
Et je veux dire, si vous vouliez une doublure très sale parce que je m'ennuyais .. Vous pouvez le faire.
static void Main(string[] args) { var lines = File.ReadAllLines("text.txt"); var newLines = new string[lines.Count()]; for (var i = 0; i < lines.Count(); i++) { if (i == 0) { newLines[i] = lines[i].ToUpper(); } else { foreach (var word in lines[i].Split(' ')) { newLines[i] += string.Format("{0} ", word.Length >= 3 ? CultureInfo.CurrentCulture.TextInfo.ToTitleCase(word) : word); } } } File.WriteAllLines("newText.txt", newLines); }
Le libellé de votre question me déroute, mais comme vous avez dit que vous vous êtes perdu, je pense qu'il serait utile de séparer vos différents types de logique en méthodes elles-mêmes et d'utiliser des noms de variables plus descriptifs. Commencez donc par décomposer votre code en MakeFirstLineUppercase (), IsWordOverThreeLetters (), MakeWordCapitalized () etc. puis nommez vos variables comme
var currentLine = s.Trim ()
...var currentTrimmedLine < / code> etc. Réécrire simplement votre code comme celui-ci peut résoudre la plupart de vos problèmes.
Merci pour les conseils J'ai eu la solution dans le commentaire mais je vais aussi le faire pour le rendre plus organisé et plus facile à comprendre afin que je ne me perde plus plus tard. @aweyeahdawg