使用 CsvHelper 时获取跳过的空行数?

Get number of skipped blank lines when using CsvHelper?

当您使用 IgnoreBlankLines 属性 或 CsvConfiguration 配置 CsvReader 并配置为跳过空行时,我该如何着手获取跳过的行数?

或者,如果我不跳过它们 - 我该如何跟踪它们?

空行似乎由具有空字符串作为值的第一个字段表示,然后每个其他字段都具有 null - 但这是一个实现细节 - 即,实际数据可能会进入这种格式,还是我错了?

如果您的文件有 header,您可以阅读 header,然后获取您所在的行号。以下示例跳过两行,因此在读取 header 时该行为 3。

void Main()
{
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        IgnoreBlankLines = true
    };
    
    using (var reader = new StringReader("\n\nId,Name\n1,One"))
    using (var csv = new CsvReader(reader, config))
    {
        csv.Read();
        csv.ReadHeader();
        
        var firstRow = csv.Context.Parser.Row;
        
        var records = csv.GetRecords<Foo>();
        
        Console.WriteLine(firstRow); // 3
    }
}

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
}

在没有 header 的情况下获取行号只会稍微复杂一些。

void Main()
{
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        IgnoreBlankLines = true,
        HasHeaderRecord = false
    };
    
    using (var reader = new StringReader("\n\n1,One"))
    using (var csv = new CsvReader(reader, config))
    {
        var isFirstRow = true;
        var firstRow = 0;
        var records = new List<Foo>();
        
        while (csv.Read())
        {
            if (isFirstRow)
            {
                firstRow = csv.Context.Parser.Row;
                isFirstRow = false;
            }
            records.Add(csv.GetRecord<Foo>());
        }
        Console.WriteLine(firstRow); // 3
    }
}

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
}