如何在不同的RichTextBoxes中将文本文件分割成字符串?

时间:2019-04-02 21:45:56

标签: c# richtextbox streamreader

我的文本文件如下:

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

现在,我尝试用(-*-)字符串分割文本文件(<-在文本文件中总是这样!),并在不同的richtextboxes中显示它。 我实际上使用以下代码...

尝试过数据表,stringbuilder,iList ...

我的目标是在richtextbox A中获取所有textA,在richtextbox B中获取textB,等等...

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

-激活“ for”语句在两个richtbox中都显示一个“ S” ...无论出于何种原因:))

-foreach说超出索引,但是当我检查array.lenght时,它显示我在A处为1,在B处为2 ...更多

有人可以让我走上正确的路吗??

3 个答案:

答案 0 :(得分:1)

首先,您似乎希望列表包含字符串数组元素,而不是字符串元素。在这种情况下,它的类型应该为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];

参考:

答案 1 :(得分:0)

使用正则表达式

    string[] result = Regex.Split(input, @"(\(-\*-\))",
                               RegexOptions.IgnoreCase,
                               TimeSpan.FromMilliseconds(500));

答案 2 :(得分:0)

替代方法。从源文本文件中读取所有行,然后将其分配给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);
}