读取 CSV 文件时如何获得可选的 header 行?

How can I have an optional header row when reading a CSV file?

我需要导入一个 CSV 文件,该文件可能有也可能没有 header 条记录。

如果我读取的文件没有 header 行,它会假定第一个数据行是 header 而不是 return。 如果我指定 HasHeaderRecord = false 它会在有 header 记录时抛出异常。

有没有办法使用 CsvHelper 库并有一个可选的 header 记录?

我可以使用这种方法让它工作,但似乎还有更好的方法:

csvReader.Configuration.HasHeaderRecord = false;

while (csvReader.Read())
{
    try
    {
        var record = csvReader.GetRecord<MyModel>();
        myRecordList.Add(record);
    }
    catch (ReaderException rex)
    {
        // Check if this is an error with no header record and ignore
        if (rex.ReadingContext.CurrentIndex == 1 &&
            rex.ReadingContext.RawRecord.ToLower().Contains("myHeaderColumnName"))
        {
            continue;
        }
    }
}

我认为没有内置的方式来了解 csvReader。有两种方式可以知道:

  1. 信息"Header row yes/no"由用户提供
  2. 您通过阅读前几行并检查一些属性来自行实现检测逻辑。例如。几列的内容类型。

在我看来,信息应该由用户提供,或者文件来源应该符合始终提供 header 行或从不提供 header 行的标准。

我不确定这是否是最好的方法,但它确实绕过了抛出异常。

public static void Main(string[] args)
{
    using (var reader = new StreamReader("path\to\file.csv"))
    using (CsvReader csv = new CsvReader(reader))
    {
        csv.Read();
        csv.ReadHeader();

        if (!csv.Context.HeaderRecord.Contains("myHeaderColumnName"))
        {
            csv.Configuration.HasHeaderRecord = false;
            reader.BaseStream.Position = 0;
        }

        var records = csv.GetRecords<MyModel>().ToList();                        
    }
}