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

How do I write a List<String> into a .csv file as a single column?

现在我有一个简单的应用程序,其中有一个 C# object,它的属性中有一个 List<String>。它应该将字符串列表与其他属性一起存储,并将其输出为带有 headers.

的 .csv 文件

创建 object 并将其输出为 .csv 文件后,包含列表的列不在输出中,我不知道如何准确处理它或将其转换为 .csv格式。

我的预期输出是:

Name,ID,Date,Number,FilePaths,Remarks
Value1, Value2, Value3, Value 4,List here,Value6

输出的 .csv 文件将被序列化为 JSON 并在另一个组件中被反序列化,它将读取值并最终被放入数据库中。

class (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; }
}

下面是我如何根据从输入收集的数据实例化 object:

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

好像跳过了列表

编辑:

更详细地说,文件路径实际上是一个字符串列表,其中包含用户上传到程序的文件的目录路径。我打算做的是通过调用 for 循环并将它们的路径存储为有组织的方式,从 List<FileInfo> files 检索文件路径列表。这是因为一个用户可以根据需要上传多个文件。

将文件路径声明为字符串。 将 List 转换为您想要的字符串,然后 然后写入csv文件。

尝试按如下方式初始化您的对象列表:

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

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