gpt4 book ai didi

c# - 使用 csvHelper 将单元格内容读入列表或数组

转载 作者:行者123 更新时间:2023-12-03 08:47:07 27 4
gpt4 key购买 nike

我有一个以下类型的 csv 文件:

name,numbersA,numbersB
Bob,"1,2,3,4","6,7,8,9"
Brabra,"9,3","4,8,5,7,2"

因此,整数数组由“”之间的数字给出。

我想将其映射到以下类

    public class Names
{
[Name("name")]
public string Name { get; set; }

[Name("numbersA")]
public List<int> NumbersA{ get; set; }

[Name("numbersB")]
public List<int> NumbersB{ get; set; }

}

我并不特别介意 NumbersA/B 是 int[] 类型还是 List 类型。到目前为止,我设法通过将 NumbersA/B 的类型指定为字符串来读取数据,并且工作正常(我得到了“”之间的字符串)。这可以在 csvHelper 中自动完成吗?还是我必须稍后自己解析字符串。

void Main()
{
using (var reader = new StreamReader("path\\to\\file.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
var records = csv.GetRecords<Names>();
List<Names> NameList = records.ToList();
}
}

任何帮助将不胜感激。

解决方案

感谢@Oguz Ozgul(见下文)。我做了一些小改动。


public class Names
{
[Name("name")]
public string Name { get; set; }

[Name("numbersA")]
[TypeConverter(typeof(ToIntArrayConverter))]
public List<int> NumbersA{ get; set; }

[Name("numbersB")]
[TypeConverter(typeof(ToIntArrayConverter))]
public List<int> NumbersB{ get; set; }

}

public class ToIntArrayConverter : TypeConverter
{
public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
{
if (text == "") return new List<int>();
string[] allElements = text.Split(',');
int[] elementsAsInteger = allElements.Select(s => int.Parse(s)).ToArray();
return new List<int>(elementsAsInteger);
}

public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
{
return string.Join(",", ((List<int>)value).ToArray());
}
}

最佳答案

您可以实现自定义类型转换器,并在两个属性的转换(双向)期间使用它。

TypeConverter 类位于命名空间 CsvHelper.TypeConversion

TypeConverterAttribute 位于命名空间 CsvHelper.Configuration.Attributes

    public class ToIntArrayConverter : TypeConverter
{
public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
{
string[] allElements = text.Split(',');
int[] elementsAsInteger = allElements.Select(s => int.Parse(s)).ToArray();
return new List<int>(elementsAsInteger);
}

public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
{
return string.Join(',', ((List<int>)value).ToArray());
}
}

要使用此转换器,只需在属性顶部添加以下 TypeConverterAttribute 注释即可:

    public class Names
{
[Name("name")]
public string Name { get; set; }

[Name("numbersA")]
[TypeConverter(typeof(ToIntArrayConverter))]
public List<int> NumbersA { get; set; }

[Name("numbersB")]
[TypeConverter(typeof(ToIntArrayConverter))]
public List<int> NumbersB { get; set; }
}

关于c# - 使用 csvHelper 将单元格内容读入列表或数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60966194/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com