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; }
}
一直在使用 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; }
}