У меня есть 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();
}
}
Любая помощь будет очень признательна.
РЕШЕНИЕ
Credit идет к @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());
}
}