在C#中提取文本文件的特定部分

本文关键字:定部 文件 取文本 提取 | 更新日期: 2023-09-27 18:19:55

我通常逐行将文本文件中的一些字符串添加到列表或数组中,尽管我现在在文本文件中使用"#"作为分隔符。使用两个"#"符号作为断点,如何将"softpedia.com"answers"download.com"这两个字符串读取到列表中?记住两个散列之间可能有或多或少的字符串

例如

# Internal Hostnames
softpedia.com
download.com
# External Hostnames

预期输出:

softpedia.com
download.com

在C#中提取文本文件的特定部分

class Program
{
    static void Main()
    {
        using (var reader = File.OpenText("test.txt"))
        {
            foreach (var line in Parse(reader))
            {
                Console.WriteLine(line);
            }
        }
    }
    public static IEnumerable<string> Parse(StreamReader reader)
    {
        string line;
        bool first = false;
        while ((line = reader.ReadLine()) != null)
        {
            if (!line.StartsWith("#"))
            {
                if (first)
                {
                    yield return line;
                }
            }
            else if (!first)
            {
                first = true;
            }
            else
            {
                yield break;
            }
        }
    }
}

如果你想把它们放在一个列表中:

using (var reader = File.OpenText("test.txt"))
{
    List<string> hostnames = Parse(reader).ToList();
}

将其读取到缓冲区中,然后让regex完成工作。

string input = @"
# Internal Hostnames 
softpedia.com 
download.com
# External Hostnames    
";
string pattern = @"^(?!#)(?<Text>[^'r's]+)(?:'s?)";
Regex.Matches(input, pattern, RegexOptions.Multiline)
     .OfType<Match>()
     .Select (mt => mt.Groups["Text"].Value)
     .ToList()
     .ForEach( site => Console.WriteLine (site));
/* Outputs
softpedia.com
download.com
*/

听起来您想要读取一组#起始行之间的所有行。如果是,请尝试以下

List<string> ReadLines(string filePath) {
  var list = new List<string>();
  var foundStart = false;
  foreach (var line in File.ReadAllLines(filePath)) {
    if (line.Length > 0 && line[0] == '#') {
      if (foundStart) {
        return list;
      }
      foundStart = true;
    } else if (foundStart) {
      list.Add(line);
    }
  }
  return line;
}