CsvHelper:将List<string>写入CSV

3

我想知道如何使用CsvHelper将List写入CSV。我已经在这里看过了:https://github.com/JoshClose/CsvHelper/issues/837

我在CSV类中有以下属性:

public class CSV
{
    public int? Id { get; set; }
    public List<string> Header1 { get; set; }
    public string Header2 { get; set; }
    public string Header3 { get; set; }
    public string Header4 { get; set; }
    public long? Header5 { get; set; }
    public long? Header6 { get; set; }
    public long? Header7 { get; set; }
    public string Header8 { get; set; }
    public List<string> Header9 { get; set; }
    public List<string> Header10 { get; set; }
    public List<string> Header11 { get; set; }
}

写入CSV文件

var records = new List<CSV>
{
    new CSV { Header1 = new List<string>{ "value1", "value2" } }
};

using (var writer = new StreamWriter("path\\to\\file.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
    csv.WriteRecords(records);
}

最终结果应该是这样的。
Header1
value1,value2

任何帮助都将不胜感激。


2
你需要在这里放入一个文件名 using (var writer = new StreamWriter(@"c:\test.csv")) - undefined
1
Header1 = "value1","value2" 看起来有点奇怪...你怎么能把两个字符串值赋给一个字符串?我猜你想要 Header1 = "value1, value2" 吧?即使 Header1 是一个 List<string>,这样的赋值也是不行的。在这种情况下,你应该使用 Header1 = new List<string> { "value1","value2"}。不清楚你到底想要实现什么。 - undefined
@Andy 我已经添加了文件。谢谢你。 - undefined
@JohnG 问题是标题仍未写入CSV文件。 - undefined
@JohnG 我已经添加了这个类。请查看。 - undefined
1个回答

5
我猜你想找的是这样的内容。这将从 Header1 列表中创建一个逗号分隔的字符串。
public class Program
{
    static void Main(string[] args)
    {        
        var records = new List<CSV>
        {
            new CSV { Id = 1, Header1 = new List<string>{ "value1", "value2" } }
        };

        using (var csv = new CsvWriter(Console.Out, CultureInfo.InvariantCulture))
        {
            csv.Configuration.RegisterClassMap<CSVMap>();
            csv.WriteRecords(records);
        }

        Console.ReadKey();
    }
}

public class CSVMap : ClassMap<CSV>
{
    public CSVMap()
    {
        AutoMap(CultureInfo.InvariantCulture);
        Map(m => m.Header1).ConvertUsing(row => string.Join(",", row.Header1)).Index(0);
    }
}

public class CSV
{
    public int? Id { get; set; }
    public List<string> Header1 { get; set; }
}

给您一个输出:
Id,Header1
1,"value1,value2"

谢谢你的回答,大卫。现在标题1出现在文件末尾。CSV的标题现在不是按顺序排列的。 - undefined
1
尝试使用Map(m => m.Header1).ConvertUsing(row => string.Join(",", row.Header1)).Index(0);。否则,您可能需要逐个映射每一列,按照您希望的顺序进行映射,而不是使用AutoMap(CultureInfo.InvariantCulture); - undefined
@DavidSpecht 有没有办法将字符串列表写入具有相同标题名称的多列中? - undefined
@Farshan,请查看我在GitHub上对你的问题的回答。https://github.com/JoshClose/CsvHelper/issues/837#issuecomment-822486362 - undefined
@DavidSpecht 谢谢,我猜我必须在循环中手动编写标题,因为字符串列表的长度是动态的。 - undefined
2
如果您在使用 CsvHelper 版本 [20.0.0](https://joshclose.github.io/CsvHelper/change-log/)之后遇到此答案,请注意 .ConvertUsing 现在更改为 .Convert。另外,csv.Configuration.RegisterClassMap<CSVMap>(); 应更改为 csv.Context.RegisterClassMap<CSVMap>(); - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接