Как получить текстовый файл, чтобы разделить на строку в разных RichTextBoxes? - PullRequest
0 голосов
/ 03 апреля 2019

Мой текстовый файл выглядит следующим образом:

(-*-)
textA1
textA2
textA3
(-*-)
textB1
textB2
textB3
(-*-)
textC1
...

Теперь я пытаюсь разбить текстовый файл на строку (-*-) (<- это всегда так в текстовом файле!) И показать его вразные richtextboxes.На самом деле я использую следующий код ... </p>

Пробовал с datatable, stringbuilder, iList ...

Моя цель - получить весь текст A в richtextbox A, textB в richtextbox B и так далее ...

 private void öffnenToolStripMenuItem_Click(object sender, EventArgs e)
    {
        var seiten = new List<string>();

        if (oFDOpenDatei.ShowDialog() == DialogResult.OK)
        {                
            using (StreamReader sr = new StreamReader(oFDOpenDatei.FileName))
            {
                while (!sr.EndOfStream)
                {
                    string[] read = sr.ReadLine().Split(new string[] { "(-*-)" }, StringSplitOptions.None);

                    for (int i = 0; i < read.Length; i++)
                    {
                        seiten.Add(Convert.ToString(read));
                    }

                    //foreach (var item in read)
                    //{
                    //    seiten.Add(Convert.ToString(item));
                    //}
                }
                sr.Close();
            }

            rTBA.Text = seiten[0][0].ToString();
            rTBB.Text = seiten[1][0].ToString();
        }
    }

-активация activ для for показывает «S» в обоих richtbox ... по любой причине:))

- foreach говорит вне индекса, но когдая проверяю array.lenght, он показывает мне 1 в A и 2 в B ... не более

Может кто-нибудь, пожалуйста, вывести меня на правильный путь!?

Ответы [ 3 ]

1 голос
/ 03 апреля 2019

Прежде всего, похоже, что вы хотите, чтобы ваш список содержал элементы массива строк, а не строковые элементы.В этом случае он должен иметь тип List<string[]>.

Во-вторых, когда вы используете ReadLine(), он возвращает только одну строку .Если вы хотите разделить на основе определенной строки, вам нужно прочитать несколько строк.

Вот простое решение с LINQ:

var seiten = new List<string[]>();
var allLines = File.ReadAllLines(oFDOpenDatei.FileName);

int consumedLines = 0;
while (consumedLines < allLines.Length)
{
    var group = allLines.Skip(consumedLines).TakeWhile(s => s != "(-*-)").ToArray();
    if (group.Any()) seiten.Add(group);
    consumedLines += group.Length + 1;
}

Если вам не нужен доступ к отдельным строкамиз той же группы, тогда вы все еще можете использовать List<string> и настроить приведенный выше код примерно так:

var seiten = new List<string>();
var allLines = File.ReadAllLines(oFDOpenDatei.FileName);

int consumedLines = 0;
while (consumedLines < allLines.Length)
{
    var group = allLines.Skip(consumedLines).TakeWhile(s => s != "(-*-)").ToArray();
    if (group.Any()) seiten.Add(string.Join(Environment.NewLine, group));
    consumedLines += group.Length + 1;
}

rTBA.Text = seiten[0];
rTBB.Text = seiten[1];

Ссылки:

0 голосов
/ 03 апреля 2019

Альтернативный метод. Все строки считываются из исходного текстового файла, а затем присваиваются каждому члену List<TextBoxBase> (вы можете включить как элементы управления RichTextBox, так и TextBox), используя селектор, который увеличивается каждый раз при обнаружении строкового шаблона.

Если количество элементов управления в списке меньше количества групп в текстовом файле, цикл заполнит только перечисленные элементы управления, а затем прекратит работу.

int groupID = -1;
string pattern = "(-*-)";
List<TextBoxBase> controls = new List<TextBoxBase>() { rTBA, rTBB, rTBC };

string[] input = File.ReadAllLines("[File Path]");
for (int i = 0; i < input.Length; i++) {
    if (input[i].Contains(pattern)) { 
        groupID += 1; 
        continue; 
    }
    if (groupID == controls.Count) break;
    controls[groupID].AppendText(input[i] + Environment.NewLine);
}
0 голосов
/ 03 апреля 2019

с использованием Regex

    string[] result = Regex.Split(input, @"(\(-\*-\))",
                               RegexOptions.IgnoreCase,
                               TimeSpan.FromMilliseconds(500));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...