CsvHelper忽略标题名称的大小写。

31

我有一些类

public class Import
{
    public DateTime Date { get; set; }
    public string Category { get; set; }
}

在 CSV 文件中,标题名称可能是小写的。我如何在读取文件时忽略大小写呢?

    var reader = new StreamReader(@"///");
    var csv = new CsvReader(reader);
           
    var records = csv.GetRecords<Import>().ToList();
3个回答

34

如果您正在使用http://joshclose.github.io/CsvHelper/,则可以在构建CsvReader或构建后配置它时提供一些配置。

    using (var stringReader = new StringReader(yourString))
    using (var csvReader = new CsvReader(stringReader))
    {
        // Ignore header case.
        csvReader.Configuration.PrepareHeaderForMatch =  (string header, int index) => header.ToLower();
        return csvReader.GetRecords<Import>().ToList();
    }

https://joshclose.github.io/CsvHelper/api/CsvHelper.Configuration/Configuration/的PrepareHeaderForMatch部分有更多的文档。

如果需要更细粒度的操作,还可以找到类映射说明,位于此处:https://joshclose.github.io/CsvHelper/examples/configuration

希望这有所帮助。


4
走"PrepareForMatch ToLower()"这条路,这不需要你要绑定的C#类所有的属性都是小写吗?也就是说,仍然要求输入的大小写与你的模型匹配吗?否则,它们的大小写还是会不同。要求大小写匹配远非"大小写不敏感"。 - Don Cheadle
2
随机的旧CsvHelper代码显示csvReader.Configuration.IsHeaderCaseSensitive = true;,但是这个Configuration属性现在似乎不再是库的一部分了?看起来像银弹被移除了。 - Don Cheadle
4
我会尽力进行翻译,请问原文所在的语境是什么?这有助于我更好地理解并提供准确的翻译。 - KevinVictor
7
@DonCheadle,ToLower()方法被应用于文件头和类的属性,因此实际上进行了不区分大小写的比较。 - kristianp
3
大家好,这个解决方案已不再受支持,因为配置API已经更改。对我来说,@Ambrose Leung的更改起作用了https://dev59.com/y1UL5IYBdhLWcg3w-cLr#67167414 - Reece Russell

25

在当前版本的CsvHelper中,您需要像这样进行配置:

var csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture)
{
    PrepareHeaderForMatch
    = args => args.Header.ToLower()
};
using (var reader = new StreamReader(inputFile))
using (var csv = new CsvReader(reader, csvConfig))
{
    ...
}

为避免与当前文化不一致,请使用 ToLowerInvariant - Guilherme Bley

0
Mak(2022-09-26)的博客文章介绍了三种不同的配置CsvHelper的方法。
当您的CSV标题名称与属性名称不完全匹配时,CsvHelper会抛出异常。例如,如果您的标题名称为“title”,而属性名称为“Title”,则会抛出异常,如:HeaderValidationException:未找到名称为'Title'[0]的标题。
如果您不想(或无法)更改名称以匹配,则可以配置CsvHelper将标题映射到具有不同名称的属性。您有三个选项:
1. 在需要的属性上使用[Name]属性。 2. 当存在命名差异模式(例如大小写差异)时,使用CsvConfiguration.PrepareHeaderForMatch。 3. 使用ClassMap显式声明应如何映射所有属性。

C# – 当标题名称与属性不同时配置CsvHelper


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接