我正在尝试解析文本文件并遇到问题。我需要在“MESSAGE”之后读一行。
该文件将包含以下示例数据。
MESSAGE
2005修理汽车驾驶员侧。
MESSAGE
1508修复水力悬浮液。
在这种情况下,我想阅读从2005年和1508年开始的行。
这是我的代码
List<Record> records = new List<Record>();
using (FileStream fs = new FileStream("SampleData.txt", FileMode.Open))
{
using (StreamReader rdr = new StreamReader(fs))
{
string tempreadline;
tempreadline = rdr.ReadLine();
while (tempreadline != null)
{
if (tempreadline.Contains("MESSAGE")
{
// what do I do here?
// skip "MESSAGE" line and read the next line
}
}
}
}
有什么建议吗?谢谢!
答案 0 :(得分:1)
方法1
使用您的方法。
Console.WriteLine("METHOD 1");
var records = new List<string>();
using (var fs = new FileStream("d:\\SampleData.txt", FileMode.Open))
{
using (var rdr = new StreamReader(fs))
{
var msgFound = false;
while (!rdr.EndOfStream)
{
var tempreadline = rdr.ReadLine();
if (tempreadline.Contains("MESSAGE"))
{
msgFound = true;
}
else if (msgFound && !string.IsNullOrEmpty(tempreadline))
{
records.Add(tempreadline);
msgFound = false;
}
}
}
}
records.ForEach(r => Console.WriteLine(r));
方法2
假设您的文字是单个字符串。
Console.WriteLine("METHOD 2");
var text = File.ReadAllText("d:\\SampleData.txt");
records = text.Split(new[] { "MESSAGE" }, StringSplitOptions.RemoveEmptyEntries)
.Select(t => t.Trim(' ', '\r', '\n'))
.Where(t => !string.IsNullOrEmpty(t))
.ToList();
records.ForEach(r => Console.WriteLine(r));
方法3
假设您的文字是字符串列表。
Console.WriteLine("METHOD 3");
var texts = File.ReadLines("d:\\SampleData.txt");
records = texts.Where(t => !string.IsNullOrEmpty(t) && !t.StartsWith("MESSAGE"))
.ToList();
records.ForEach(r => Console.WriteLine(r));
方法4
使用正则表达式。
Console.WriteLine("METHOD 4");
records = new Regex(@"^MESSAGE[\s]*$", RegexOptions.IgnoreCase | RegexOptions.Multiline)
.Split(text)
.Select(t => t.Trim(' ', '\r', '\n'))
.Where(t => !string.IsNullOrEmpty(t))
.ToList();
records.ForEach(r => Console.WriteLine(r));
答案 1 :(得分:0)
如果所需内容位于文件中,您可以使用File.ReadAllLines
方法(描述为here)和Linq扩展方法的组合,如下所示。数组DesiredLines
可以进一步处理。
var DesiredLines = File.ReadAllLines("C:\FileName.txt")
.Where( iLine => iLine != "MESSAGE" && iLine != "")
.ToArray();