Добавить в строку, пока не достигнет длины (Noobie C # парень) - PullRequest
0 голосов
/ 10 ноября 2011

Я пытаюсь прочитать текстовый файл, разбить его на массив строк, а затем скомпилировать новые строки из слов, но я не хочу, чтобы его длина превышала 120 символов.

Что я делаю, так это заставляю его писать PML для создания макроса для некоторого программного обеспечения, которое я использую, и текст не может превышать 120 символов. Чтобы продвинуться еще дальше, мне нужно обернуть 120 символов или меньше (до ближайшего слова), строка «BTEXT | строка здесь |» которая является командой.

Вот код:

static void Main(string[] args)
{
     int BIGSTRINGLEN = 120;

     string readit = File.ReadAllText("C:\\stringtest.txt");
     string finish = readit.Replace("\r\n", " ").Replace("\t", "");
     string[] seeit = finish.Split(' ');
     StringBuilder builder = new StringBuilder(BIGSTRINGLEN);
     foreach(string word in seeit)
     {
          while (builder.Length + " " + word.Length <= BIGSTRINGLEN)
          {
                builder.Append(word)
          }

     }
}

Ответы [ 3 ]

2 голосов
/ 10 ноября 2011

Попробуйте использовать if вместо while, поскольку вы будете постоянно добавлять одно и то же слово, если нет !!

1 голос
/ 10 ноября 2011

Мэтью Лун прав - ваша петля while не будет работать так, как в данный момент.

Но кроме этого у вас есть некоторые проблемы в этой строке

while (builder.Length + " " + word.Length <= BIGSTRINGLEN) 

builder.Length и word.Length - целые числа - количество символов в каждом слове. " " это не целое число, это строка. Вы не можете правильно добавить 10 + " " + 5. Вы вероятно хотите

while (builder.Length + (" ").Length + word.Length <= BIGSTRINGLEN) 

// or 
while (builder.Length + 1 + word.Length <= BIGSTRINGLEN) 
1 голос
/ 10 ноября 2011

Вместо того, чтобы читать весь файл в память, вы можете прочитать его по очереди за раз. Это уменьшит ваши требования к памяти, а также избавит вас от необходимости заменять символы новой строки.

StringBuilder builder = new StringBuilder(BIGSTRINGLEN);
foreach (var line in File.ReadLines(filename))
{
    // clean up the line.
    // Do you really want to replace tabs with nothing?
    // if you want to treat tabs like spaces, change the call to Split
    // and include '\t' in the character array.
    string finish = line.Replace("\t", string.Empty);
    string[] seeit = finish.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries);
    foreach (string word in seeit)
    {
        if ((builder.Length + word.Length + 1 <= BIGSTRINGLEN)
        {
            if (builder.Length != 0)
                builder.Append(' ');
            builder.Append(word);
        }
        else
        {
            // output line
            Console.WriteLine(builder.ToString());
            // and reset the builder
            builder.Length = 0;
        }
    }
}
// and write the last line
if (builder.Length > 0)
    Console.WriteLine(builder.ToString());

Этот код потерпит неудачу, если слово длиннее BIGSTRINGLEN. Длинные слова будут заканчиваться выводом пустой строки. Я думаю, что вы можете понять, как справиться с этим делом, если оно станет проблемой.

...