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

时间:2012-01-08 21:02:28

标签: c# .net windows

我通常会将文本文件中的一些字符串逐行添加到列表或数组中,尽管我现在使用“#”作为文本文件中的分隔符。如何使用两个“#”符号作为断点来读取两个字符串“softpedia.com”和“download.com”到列表中怎么样?请记住,两个哈希之间可能存在更多或更少的字符串

e.g。

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

预期产出:

softpedia.com
download.com

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

将其读入缓冲区并让正则表达式完成工作。

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
*/

答案 2 :(得分:0)

听起来你想要阅读一组#start行之间的所有行。如果是这样,请尝试以下

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