[英]Trying to ignore blank lines to parse the last occurrence of a string in a text file
所以我有这个文本文件的结构如下:
Date: 12/23/23
.
.
.
Date: 12/23/66
.
.
Date: 12/25/67
为此,我试图获取日期的最后一次发生,即:
Date: 12/25/67
有了这个,我已经知道如何通过这段代码:
string date = "";
foreach(string line in File.ReadAllLines("mytext.txt"))
{
date = GetDate_value(line, date);
}
public static string GetDate_value(string line, string date)
{
if (line.Contains("Date:"))
{
date = line;
}
string[] separatingStrings = { "Date: " };
string[] str = date.Split(separatingStrings, System.StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine("[{0}]", string.Join(", ", str));
return str.Last();
}
有了这个,当我返回日期时,我得到了最后一次出现。 但是,我试图将其进一步解析到仅包含 12/25/67 的位置。
有了这个,我知道上面的逻辑如何。 但是,当我尝试解析文件时,我得到一个错误,说元素中的数组不存在。 进一步检查显示与我的Console.WriteLine
数组显示:
[]
[]
[]
[]
[ , 12/25/67]
[ , 12/25/67]
[ , 12/25/67]
[ , 12/25/67]
.
.(repeats for how many lines in text file)
我想知道为什么我在开始部分没有得到任何元素,而一切都应该是:
[ , 12/25/67]
[ , 12/25/67]
[ , 12/25/67]
[ , 12/25/67]
我尝试使用它来替换foreach
行:
foreach (string line in File.ReadAllLines(file).Where(line => !string.IsNullOrWhiteSpace(line)))
但是它仍然没有忽略最后一行。 我将如何使它在开始时忽略 null 元素?
编辑
因此,在获取日期 function 中使用这个 if 语句:
string[] separatingStrings = { "Date: " };
string[] str = date.Split(separatingStrings, System.StringSplitOptions.RemoveEmptyEntries);
if(str.Length == 0)
{
Console.WriteLine("null");
}
我发现这些values([])
的长度为 0,那么我怎么能跳过长度 0 arrays 来忽略它?
也许尝试这样做:
string last =
File
.ReadLines("mytext.txt")
.Aggregate(
(string)null,
(a, x) =>
x.StartsWith("Date: ")
? x.Substring("Date: ".Length)
: a)
如果last
是null
那么您的文本文件不包含以"Date: "
开头的行,否则它将包含文件中的最后一个日期(尽管仍然是一个字符串)。
我还选择了File.ReadLines
,因为它会懒惰地读取文件,因此文件大小应该不是问题。
您的代码片段中的问题是GetDate_value
function,无论传递的行是否包含Date:
:,您都在其中执行相同的代码。 您需要将所有内容移至if
块以返回日期,否则 function 应返回null
或string.Empty
。
void TheCaller()
{
var f = "myText.txt";
var dates = new List<string>();
foreach (string line in File.ReadLines(f)
.Where(l => l.Length > 6)) //At least...
{
var date = GetDate_value(line);
if (date != null)
dates.Add(date);
}
Console.WriteLine("[{0}]", string.Join(", ", dates));
}
public static string GetDate_value(string line)
{
string output = null;
if (line.StartsWith("Date:"))
{
output = line.Split(new[] { " " },
StringSplitOptions.RemoveEmptyEntries).LastOrDefault();
}
return output;
}
您可以将上述内容替换为:
void TheCaller()
{
var f = "myText.txt";
var dates = File.ReadLines(f)
.Where(l => l.StartsWith("Date: "))
.Select(l => l.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries)
.LastOrDefault()).ToList();
Console.WriteLine("[{0}]", string.Join(", ", dates));
}
给定示例的 output 是:
[12/23/23, 12/23/66, 12/25/67]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.