如何将List <String>作为单个列写入.csv文件?

时间:2019-06-19 03:27:15

标签: c# csv csvhelper

现在,我有一个简单的应用程序,其中有一个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中检索文件路径的列表。这是因为一个用户可以根据要求上传多个文件。

3 个答案:

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