CsvHelper PrepareHeaderForMatch returns 上下文作为一项数组

CsvHelper PrepareHeaderForMatch returns Context as one-item array

一直在使用 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 returns 一个包含多个记录的数组,每列一个。

v12.3.2 的代码如下所示:

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

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

提前致谢!

更新 - 这是分隔符的问题,自版本 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 = ",";

我一定是漏掉了什么。无论是使用 6.0.0 版还是 12.3.2 版,var record 都得到相同的结果。我猜你的数据还有更多我没有看到的内容。

版本 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; }
}