CsvHelper PrepareHeaderForMatch 将上下文作为单项数组返回



一直在使用 CsvHelper 版本 6.0.0,决定升级到最新版本(当前为 12.3.2(,并发现它使用了另一个参数,lambda 中的 index forcsv.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 仅找到 1 列用于@dzookatz的原因。解决方案是在配置中指定分隔符。

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

最新更新