我有一些简单的代码,可以从 .csv 文件加载数据表(如果它包含标题)。现在我需要从没有标题的文件加载数据表。我期望设置 HasHeaderRecord = false 并且将使用默认标头(Field1、Field2、...)创建 DataTable。情况并非如此,我可以看到记录是由 CsvReader 读取的,但由于没有标题,因此在 DataTable 中没有创建列。看起来这应该很简单,我错过了什么?此外,不能使用类映射进行硬编码或加载,因为文件是动态的。
var dt = new DataTable();
var csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture)
{
HasHeaderRecord = false
};
var enc = System.Text.ASCIIEncoding.UTF8;
using (var reader = new StreamReader(FileName, enc, true))
using (var csv = new CsvReader(reader, csvConfig))
{
// Do any configuration to `CsvReader` before creating CsvDataReader.
using (var dr = new CsvDataReader(csv))
{
dt.Load(dr);
}
}
似乎是库中的一个错误,您可以在此处阅读: https://github.com/JoshClose/CsvHelper/issues/1240
更新:2024 年 2 月 1 日:他们上周修复了它
由于他们在过去的两年里都没有解决这个问题,谁知道他们是否会这样做。在此之前,您可以使用此代码,它应该按预期工作:
using (var reader = new StreamReader(FileName, enc, true))
using (var csv = new CsvReader(reader, csvConfig))
using (var dr = new CsvDataReader(csv))
{
while (dr.Read())
{
if (dt.Columns.Count == 0)
{
for (int i = 0; i < dr.FieldCount; i++)
dt.Columns.Add();
}
DataRow row = dt.NewRow();
for (int i = 0; i < dr.FieldCount; i++)
row[i] = dr.GetString(i);
dt.Rows.Add(row);
}
}