繁体   English   中英

试图忽略空行来解析文本文件中最后一次出现的字符串

[英]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)

如果lastnull那么您的文本文件不包含以"Date: "开头的行,否则它将包含文件中的最后一个日期(尽管仍然是一个字符串)。

我还选择了File.ReadLines ,因为它会懒惰地读取文件,因此文件大小应该不是问题。

您的代码片段中的问题是GetDate_value function,无论传递的行是否包含Date: :,您都在其中执行相同的代码。 您需要将所有内容移至if块以返回日期,否则 function 应返回nullstring.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM