如何让一个文本文件在不同的 RichTextBoxes 中被一个字符串分割?
How to get a text file to split by a string in different RichTextBoxes?
我的文本文件如下所示:
(-*-)
textA1
textA2
textA3
(-*-)
textB1
textB2
textB3
(-*-)
textC1
...
现在我尝试用 (-*-)
字符串分割文本文件(<-在文本文件中总是这样!)并在不同的富文本框中显示它。
我实际使用以下代码...
尝试使用数据表、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();
}
}
-activ "for" 语句在两个 richtboxes 中显示 "S" ... 无论出于何种原因:))
-foreach 说超出索引,但是当我检查 array.lenght 时,它显示 A 处有 1 个,B 处有 2 个……不是更多
有人可以让我走上正轨吗?
使用正则表达式
string[] result = Regex.Split(input, @"(\(-\*-\))",
RegexOptions.IgnoreCase,
TimeSpan.FromMilliseconds(500));
首先,您似乎希望列表包含字符串元素数组,而不是字符串元素。在这种情况下,它应该是 List<string[]>
.
类型
其次,当你使用ReadLine()
时,它returns只有一行。如果希望按特定行拆分,则需要读取多行。
这是一个使用 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];
参考文献:
替代方法。所有行都从源文本文件中读取,然后分配给 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);
}
我的文本文件如下所示:
(-*-)
textA1
textA2
textA3
(-*-)
textB1
textB2
textB3
(-*-)
textC1
...
现在我尝试用 (-*-)
字符串分割文本文件(<-在文本文件中总是这样!)并在不同的富文本框中显示它。
我实际使用以下代码...
尝试使用数据表、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();
}
}
-activ "for" 语句在两个 richtboxes 中显示 "S" ... 无论出于何种原因:))
-foreach 说超出索引,但是当我检查 array.lenght 时,它显示 A 处有 1 个,B 处有 2 个……不是更多
有人可以让我走上正轨吗?
使用正则表达式
string[] result = Regex.Split(input, @"(\(-\*-\))",
RegexOptions.IgnoreCase,
TimeSpan.FromMilliseconds(500));
首先,您似乎希望列表包含字符串元素数组,而不是字符串元素。在这种情况下,它应该是 List<string[]>
.
其次,当你使用ReadLine()
时,它returns只有一行。如果希望按特定行拆分,则需要读取多行。
这是一个使用 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];
参考文献:
替代方法。所有行都从源文本文件中读取,然后分配给 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);
}