c# - CsvHelper PrepareHeaderForMatch 将 Context 作为一项数组返回

标签 c# csvhelper

一直在使用 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 中的列数组?

提前致谢!

最佳答案

更新 - 这是自版本 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; }
}

关于c# - CsvHelper PrepareHeaderForMatch 将 Context 作为一项数组返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59718524/

相关文章:

c# - 类型 'xxx' 在未引用的程序集中定义

c# - csvHelper动态加载子类

c# - 使用 CsvHelper 解析标题包含空格的 CSV

c# - CSV Helper 如何读取具有多个标题行的 csv 文件

c# - 使用结构从C#中的方法返回成功/失败,错误消息和插入的ID的优点

C# 6 自动初始化属性和支持字段的使用

c# - 如何使用 CSV 助手附加 CSV?

c# - CSVHelper 如何将字符串映射到对象

c# - 数组为所有索引返回相同的值

c# - 如何将日期从格式 "dd/mm/yyyy"转换为 "yyyy/dd/mm"?