【问题标题】:Get number of skipped blank lines when using CsvHelper?使用 CsvHelper 时获取跳过的空白行数?
【发布时间】:2021-10-10 11:42:08
【问题描述】:

当您使用CsvConfigurationIgnoreBlankLines 属性将CsvReader 配置为跳过空行时,我该如何获取跳过的行数?

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

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

【问题讨论】:

  • 在 csv 文件中,空行将是一个带有空字符串的列,因此它应该始终表示空行,第一列为空,其余为 null,尽管我认为你' d 只需要检查第二列是否为null
  • @juharr 我会从Parser 对象中读取RawRecord,并检查r/n/ 或/n - 如果有不匹配,则表示它不是空白线。感谢您指出这一点!

标签: c# .net csv .net-core csvhelper


【解决方案1】:

如果您的文件有标题,您可以读取标题,然后获取您所在的行号。以下示例跳过了两行,因此在读取标题时该行为 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; }
}

获取没有标题的行号只会稍微复杂一些。

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; }
}

【讨论】:

  • Parser.RawRowParser.Row 有什么区别?我正在使用 RawRow。
  • new StringReader("\n\n1,\"One \n Two\"") 试试第二个例子。 RawRow 会给您 4,因为从技术上讲,一和二之间的换行符会将您放在文档的第 4 行。 Row 会给你 3,因为你在逻辑上仍然在数据的第 3 行。
  • 有趣,谢谢。我坚持RawRow 是正确的,因为我感兴趣的是文件中的实际行。我会将其标记为已接受的答案 - 我使用了您在此处演示的相同技术,但只是没有时间自己回答,干杯并感谢您回答所有有关 CsvHelper 的问题! :)
  • 是的,这完全取决于您要查找的内容。如果您正在查找跳过的行数并将我的第二个示例与RawRow 一起使用,它将使您看起来好像跳过了 3 行而不是实际跳过的 2 行以获取第一行数据,因为您的第一行的数据占用文件中的 2 行实际行,RawRow 为您提供读取第一行数据后最终的实际行。
猜你喜欢
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
相关资源
最近更新 更多