我通常会将文本文件中的一些字符串逐行添加到列表或数组中,尽管我现在使用“#”作为文本文件中的分隔符。如何使用两个“#”符号作为断点来读取两个字符串“softpedia.com”和“download.com”到列表中怎么样?请记住,两个哈希之间可能存在更多或更少的字符串
e.g。
# Internal Hostnames
softpedia.com
download.com
# External Hostnames
预期产出:
softpedia.com
download.com
答案 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;
}