缺少列时 CSVHelper 映射不拾取
CSVHelper mapping not picking up when column is missing
我一直在使用 CSVHelper,我必须说它绝对棒极了。当列不在文件中时,我遇到映射问题。
using (var stream = client.GetDownloadStream(string.Format("{0}{1}", _remoteFileDirectoryExports, remoteFileName)))
{
using (var s = new StreamReader(stream))
{
var csv = new CsvReader(s, new Configuration()
{
HasHeaderRecord = true,
HeaderValidated = null,
MissingFieldFound = null
});
csv.Configuration.RegisterClassMap<EverTrueInteractionMap>();
records = new List<T>();
foreach (var r in csv.GetRecords<T>())
{
records.Add(r);
}
}
}
我的映射class如下。
public class EverTrueInteraction
{
public string InteractionImportId { get; set; }
public string Solicitor1ImportId { get; set; }
public string Solicitor1EverTrueId { get; set; }
public string Solicitor1Name { get; set; }
public string Solicitor2ImportId { get; set; }
public string Solicitor2EverTrueId { get; set; }
public string Solicitor2Name { get; set; }
public string Solicitor3ImportId { get; set; }
public string Solicitor3EverTrueId { get; set; }
public string Solicitor3Name { get; set; }
public string Solicitor4ImportId { get; set; }
public string Solicitor4EverTrueId { get; set; }
public string Solicitor4Name { get; set; }
public string Solicitor5ImportId { get; set; }
public string Solicitor5EverTrueId { get; set; }
public string Solicitor5Name { get; set; }
}
public sealed class EverTrueInteractionMap : ClassMap<EverTrueInteraction>
{
public EverTrueInteractionMap()
{
AutoMap();
Map(m => m.Solicitor1ImportId).Default("");
Map(m => m.Solicitor1EverTrueId).Default("");
Map(m => m.Solicitor1Name).Default("");
Map(m => m.Solicitor2ImportId).Default("");
Map(m => m.Solicitor2EverTrueId).Default("");
Map(m => m.Solicitor2Name).Default("");
Map(m => m.Solicitor3ImportId).Default("");
Map(m => m.Solicitor3EverTrueId).Default("");
Map(m => m.Solicitor3Name).Default("");
Map(m => m.Solicitor4ImportId).Default("");
Map(m => m.Solicitor4EverTrueId).Default("");
Map(m => m.Solicitor4Name).Default("");
Map(m => m.Solicitor5ImportId).Default("");
Map(m => m.Solicitor5EverTrueId).Default("");
Map(m => m.Solicitor5Name).Default("");
}
}
当 Solicitor3 - 5 不在文件中时,它会为其值返回 null。 .Default("") 是否不适用于此?
我的理解是 .Default() 用于提供缺失的 value,但你所拥有的是缺失的 field。
因此,如果您想用 "NOVALUE" 替换空字段,那么 .Default() 是您的不二之选。如果你想处理一个完全缺失的列,你需要修改 Configuration.MissingFieldFound 设置 and/or 通过捕获异常来处理它。
见:
和
https://joshclose.github.io/CsvHelper/configuration/
您能否通过简单地设置 class 属性本身的默认值来完成您想要的?只是在构建时将它们设置为空字符串?
例如
public string Solicitor3EverTrueId { get; set; } = "";
我一直在使用 CSVHelper,我必须说它绝对棒极了。当列不在文件中时,我遇到映射问题。
using (var stream = client.GetDownloadStream(string.Format("{0}{1}", _remoteFileDirectoryExports, remoteFileName)))
{
using (var s = new StreamReader(stream))
{
var csv = new CsvReader(s, new Configuration()
{
HasHeaderRecord = true,
HeaderValidated = null,
MissingFieldFound = null
});
csv.Configuration.RegisterClassMap<EverTrueInteractionMap>();
records = new List<T>();
foreach (var r in csv.GetRecords<T>())
{
records.Add(r);
}
}
}
我的映射class如下。
public class EverTrueInteraction
{
public string InteractionImportId { get; set; }
public string Solicitor1ImportId { get; set; }
public string Solicitor1EverTrueId { get; set; }
public string Solicitor1Name { get; set; }
public string Solicitor2ImportId { get; set; }
public string Solicitor2EverTrueId { get; set; }
public string Solicitor2Name { get; set; }
public string Solicitor3ImportId { get; set; }
public string Solicitor3EverTrueId { get; set; }
public string Solicitor3Name { get; set; }
public string Solicitor4ImportId { get; set; }
public string Solicitor4EverTrueId { get; set; }
public string Solicitor4Name { get; set; }
public string Solicitor5ImportId { get; set; }
public string Solicitor5EverTrueId { get; set; }
public string Solicitor5Name { get; set; }
}
public sealed class EverTrueInteractionMap : ClassMap<EverTrueInteraction>
{
public EverTrueInteractionMap()
{
AutoMap();
Map(m => m.Solicitor1ImportId).Default("");
Map(m => m.Solicitor1EverTrueId).Default("");
Map(m => m.Solicitor1Name).Default("");
Map(m => m.Solicitor2ImportId).Default("");
Map(m => m.Solicitor2EverTrueId).Default("");
Map(m => m.Solicitor2Name).Default("");
Map(m => m.Solicitor3ImportId).Default("");
Map(m => m.Solicitor3EverTrueId).Default("");
Map(m => m.Solicitor3Name).Default("");
Map(m => m.Solicitor4ImportId).Default("");
Map(m => m.Solicitor4EverTrueId).Default("");
Map(m => m.Solicitor4Name).Default("");
Map(m => m.Solicitor5ImportId).Default("");
Map(m => m.Solicitor5EverTrueId).Default("");
Map(m => m.Solicitor5Name).Default("");
}
}
当 Solicitor3 - 5 不在文件中时,它会为其值返回 null。 .Default("") 是否不适用于此?
我的理解是 .Default() 用于提供缺失的 value,但你所拥有的是缺失的 field。
因此,如果您想用 "NOVALUE" 替换空字段,那么 .Default() 是您的不二之选。如果你想处理一个完全缺失的列,你需要修改 Configuration.MissingFieldFound 设置 and/or 通过捕获异常来处理它。
见:
和 https://joshclose.github.io/CsvHelper/configuration/
您能否通过简单地设置 class 属性本身的默认值来完成您想要的?只是在构建时将它们设置为空字符串?
例如
public string Solicitor3EverTrueId { get; set; } = "";