现在,我有一个简单的应用程序,其中有一个C#对象,该对象的属性中包含List<String>
。应该将字符串列表与其他属性一起存储,并将其输出为带有标题的.csv文件。
创建对象并将其输出为.csv文件后,包含列表的列不在输出中,并且我不知道如何准确处理它或将其转换为.csv格式。
我的预期输出是:
Name,ID,Date,Number,FilePaths,Remarks Value1, Value2, Value3, Value 4,List here,Value6
输出的.csv文件随后将被序列化为JSON,并在另一个组件中反序列化,该组件将读取值并将其最终放入数据库中。
班级(POCO):
class Object
{
public string Name { get; set; }
public string ID { get; set; }
public DateTime Date { get; set; }
public long Number { get; set; }
public List<String> FilePaths { get; set; }
public string Messages {get; set; }
}
这是我如何从输入收集的数据中实例化对象的方法:
List<String> paths = new List<String>();
foreach(var file in files)
{
paths.Add(file.FullName);
}
List<Object> newObject = new List<Object> {
new Object { Name = value1, ID = value2, Date = value3, Number = value4, FilePaths = paths, Messages = value6 };
using(var writer = new CsvWriter(outputStream))
{
writer.WriteRecords(newObject);
}
但是输出似乎是:
Name,ID,Date,Number,Remarks value1,value2,value3,value4,value6
似乎已跳过列表。
编辑:
为进一步详细说明,FilePath实际上是一个字符串列表,其中包含用户已上传到程序的文件的目录路径。我计划要做的是通过调用for循环并将其路径存储为有组织的方式来从List<FileInfo> files
中检索文件路径的列表。这是因为一个用户可以根据要求上传多个文件。
答案 0 :(得分:1)
将FilePaths声明为字符串。 将List转换为所需的字符串,然后 然后写入csv文件。
答案 1 :(得分:1)
尝试如下初始化对象列表:
List<Object> newObject = new List<Object> {
new Object {
Name = value1,
ID = value2,
Date = value3,
Number = value4,
FilePaths = paths.Any() ? $"\"{string.Join(",", paths.ToList())}\"" : null;,
Messages = value6
}
};
答案 2 :(得分:0)
CsvHelper会跳过Enumerable
个属性,除非您为其提供更多有关如何处理它们的信息。这是通过用逗号分隔每个FilePath值来输出CSV文件的一种方法。
public static void Main(string[] args)
{
var paths = new List<string> { "path1", "path2", "path3" };
List<Object> newObject = new List<Object> {
new Object
{
Name = "NameValue",
ID = "IdValue",
Date = DateTime.Now,
Number = 12345,
FilePaths = paths,
Messages = "MessagesValue"
}
};
using (var csv = new CsvWriter(outputStream))
{
csv.Configuration.RegisterClassMap(new ObjectMap());
csv.WriteRecords(newObject);
}
}
public class ObjectMap : ClassMap<Object>
{
public ObjectMap()
{
AutoMap();
Map(m => m.FilePaths).TypeConverter<ListStringConverter>();
}
}
private class ListStringConverter : StringConverter
{
public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
{
var returnValue = string.Empty;
var list = (List<string>)value;
if (list != null)
{
returnValue = string.Join(",", list);
}
return base.ConvertToString(returnValue, row, memberMapData);
}
public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
{
var list = text.Split(',').ToList();
return list;
}
}
public class Object
{
public string Name { get; set; }
public string ID { get; set; }
public DateTime Date { get; set; }
public long Number { get; set; }
public List<String> FilePaths { get; set; }
public string Messages { get; set; }
}