当我找到匹配项时,从文件中删除三个字符串

时间:2017-05-04 08:24:48

标签: c# string concatenation

我有这个应用程序,我在其中读取.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);                        
                }
            }
        }

5 个答案:

答案 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()条件,则将其考虑在内。