我有这个应用程序,我在其中读取.txt文件的内容,如下所示:
- ...
- Nonsense
- Nonsense
- Nonsense
- Line 1
- Line 2
- Line 3
- Nonsense
- Nonsense
- Line1
- Line2
- Line3
- Nonsense
- ... etc
当我找到匹配的单词“Line 1”时,我需要添加以下两行,以便得到以下结果
- Line1 Line2 Line3
- Line1 Line2 Line3
我使用streamreader和list来获取第一个值的行但是合并以下两行的最佳做法是什么? 到目前为止我的代码:
List<string> match = new List<string>();
string line;
using (StreamReader inputStream = new StreamReader(txtInput))
{
while ((line = inputStream.ReadLine()) != null)
{
if (line.Contains("Line1"))
{
match.Add(line);
}
}
}
答案 0 :(得分:1)
像这样更换你的while循环将解决你的问题。
while ((line = inputStream.ReadLine()) != null)
{
string outputLine;
if (line.Contains("Line1"))
{
outputLine = line + inputStream.ReadLine() + inputStream.ReadLine();
match.Add(outputLine);
}
}
答案 1 :(得分:1)
如果您安装了Microsoft的Interactive Framework(NuGet&#34; System.Interactive&#34;),那么您将获得一个名为IEnumerable<T>
的便捷Buffer
扩展程序。它可以让你这样做:
List<string> match =
File
.ReadLines(txtInput)
.Buffer(3, 1)
.Where(x => x[0] == "Line1")
.Select(x => String.Join(" ", x))
.ToList();
那就是它。完成工作。
答案 2 :(得分:0)
我建议不要使用StreamReader
。如果您使用File.ReadAllLines()
,则可以更轻松地遍历文本文件内容。并且您可以检查&#34; Line1&#34;之后是否有以下两行?还有很多容易。
像这样的东西
var path = Path to the file;
List<string> lines = File.ReadAllLines(path).ToList();
List<string> matches = new List<string>();
for(int i = 0; i < lines.Count; i++)
{
var line = lines[i];
if(line.Equals("Line1"))
{
if (lines.Count > i + 2)
{
matches.Add(lines[i++]);
matches.Add(lines[i++]);
matches.Add(lines[i++]);
}
}
}
答案 3 :(得分:0)
使用C#7的本地函数语法(不是必要的),您可以执行以下操作:
public IEnumerable<string> ProcessText(string txtInput)
{
IEnumerable<string> GetNextNLines(IEnumerator<string> enumerator, int n)
{
var counter = 0;
while (counter < n && enumerator.MoveNext())
{
yield return enumerator.Current;
counter += 1;
}
if (counter != n) //consider throwing with an unexpected format message.
}
using (var enumerator = File.ReadLines(txtInput).GetEnumerator())
{
while (enumerator.MoveNext())
{
if (enumerator.Current.Constains("Line1"))
{
yield return enumerator.Current;
foreach (var line in GetNextNLines(enumerator, 2)
{
yield return line;
}
}
}
}
}
这种方法很懒惰,会避免提前读取整个文件,如果它非常大,可能会导致问题。
答案 4 :(得分:0)
如果我正确理解了您的要求,您需要一个连接字符串列表,每个字符串是3行的串联,包括Line 1
和下一行。要使用流阅读器并对代码稍作修改,请执行此操作:
List<string> match = new List<string>();
string line;
using (StreamReader inputStream = new StreamReader(txtInput))
{
int charctersLeftAfterMatch = -1;
string temp = "";
while ((line = inputStream.ReadLine()) != null)
{
// If first instance is found, update characters to pick up next 2
if (line.Contains("Line1") || line.Contains("Line 1"))
{
charctersLeftAfterMatch = 3;
temp = "";
}
// If last line (3rd) has been reached then add to collection
// Else if lines are still left then concatenate and move ahead
if (charctersLeftAfterMatch-- == 1)
{
temp += line;
match.Add(temp);
}
else if (charctersLeftAfterMatch > 0)
{
temp += line;
}
}
}
// Match contains 2 string's:
// [0] Line 1 Line 2 Line 3
// [1] Line1 Line2 Line3
此外,请注意您在第一种情况下有Line 1
,下次有Line1
。如果修改了.Contains()
条件,则将其考虑在内。