0
votes

Chaque mot de plus de 3 lettres commence par une majuscule + la première ligne est en majuscule - question rapide

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!


2 commentaires

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


3 Réponses :


3
votes

Si vous voulez laisser tout le reste tel quel, au lieu de

Console.Write(s.ToUpper())

utilisez ceci:

Console.WriteLine(s.ToUpper());


3 commentaires

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]);



1
votes

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())));
        }
    }
}


0 commentaires

1
votes

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);
}


0 commentaires