首页 > 解决方案 > CsvHelper PrepareHeaderForMatch 将 Context 作为一项数组返回

问题描述

一直在使用 CsvHelper 版本 6.0.0,决定升级到最新版本(当前为 12.3.2),发现它使用了另一个参数,即 lambda 中的索引csv.Configuration.PrepareHeaderForMatch,(Func<string,int,string>)。

v6.0.0 的代码如下所示:

csv.Configuration.PrepareHeaderForMatch = header => Regex.Replace(header, @"\/", string.Empty);

对于上一行,IReadingContext.Record返回一个包含多条记录的数组,每列一个。

v12.3.2 的代码如下所示:

csv.Configuration.PrepareHeaderForMatch = (header, index) => Regex.Replace(header, @"\/", string.Empty);

但是ReadingContext.Record现在返回一个数组,其中所有列都在一条记录中。两个版本使用完全相同的文件。尝试弄乱 lambda,但结果是一样的。如何获取数组中的列Records

提前致谢!

标签: c#csvhelper

解决方案


更新- 这是自 6.0.0 版以来已更改的分隔符的问题。默认分隔符现在使用CultureInfo.CurrentCulture.TextInfo.ListSeparator. 因为我在美国,ListSeparator所以,这两个例子都对我有用。对于许多国家/ListSeparator地区来说;,这就是为什么在 12.3.2 版中,@dzookatz 仅找到 1 列。解决方案是在配置中指定分隔符。

csv.Configuration.PrepareHeaderForMatch = header => Regex.Replace(header, @"\/", string.Empty);
csv.Configuration.Delimiter = ",";

我肯定错过了什么。var record无论使用版本 6.0.0 还是 12.3.2 ,我都会得到相同的结果。我猜你的数据还有更多我没有看到的情况。

版本 6.0.0

class Program
{
    static void Main(string[] args)
    {
        var fooString = $"Id,First/Name{Environment.NewLine}1,David";

        using (var reader = new StringReader(fooString))
        using (var csv = new CsvReader(reader))
        {
            csv.Configuration.PrepareHeaderForMatch = header => Regex.Replace(header, @"\/", string.Empty);

            csv.Read();
            csv.ReadHeader();

            while (csv.Read())
            {
                var record = csv.Context.Record;
            }
        }
    }
}

public class Foo
{
    public int Id { get; set; }
    public string FirstName { get; set; }
}

版本 12.3.2

public class Program
{
    public static void Main(string[] args)
    {
        var fooString = $"Id,First/Name{Environment.NewLine}1,David";

        using (var reader = new StringReader(fooString))
        using (var csv = new CsvReader(reader))
        {
            csv.Configuration.PrepareHeaderForMatch = (header, index) => Regex.Replace(header, @"\/", string.Empty);

            csv.Read();
            csv.ReadHeader();

            while (csv.Read())
            {
                var record = csv.Context.Record;
            }
        }
    }
}

public class Foo
{
    public int Id { get; set; }
    public string FirstName { get; set; }
}

推荐阅读