读取 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。有两种方式可以知道:
- 信息"Header row yes/no"由用户提供
- 您通过阅读前几行并检查一些属性来自行实现检测逻辑。例如。几列的内容类型。
在我看来,信息应该由用户提供,或者文件来源应该符合始终提供 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();
}
}
我需要导入一个 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。有两种方式可以知道:
- 信息"Header row yes/no"由用户提供
- 您通过阅读前几行并检查一些属性来自行实现检测逻辑。例如。几列的内容类型。
在我看来,信息应该由用户提供,或者文件来源应该符合始终提供 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();
}
}