如何将 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; }
}
现在我有一个简单的应用程序,其中有一个 C# object,它的属性中有一个 List<String>
。它应该将字符串列表与其他属性一起存储,并将其输出为带有 headers.
创建 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; }
}