【问题标题】:CsvHelper : Writing List<string> to CSVCsvHelper : 将 List<string> 写入 CSV
【发布时间】:2020-09-15 04:31:14
【问题描述】:

我想知道如何使用 CsvHelper 将列表写入 CSV。我看了一下here

我在 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

任何帮助将不胜感激。

【问题讨论】:

  • 这里需要输入文件名using (var writer = new StreamWriter(@"c:\test.csv"))
  • Header1 = "value1","value2" 看起来很奇怪……如何将两个字符串值分配给一个字符串?我猜你想要Header1 = "value1, value2"?即使Header1List&lt;string&gt;,分配也不会起作用。在这种情况下,你会想要……Header1 = new List&lt;string&gt; { "value1","value2"}。目前尚不清楚您到底想达到什么目标。
  • @Andy 我添加了文件。谢谢
  • @JohnG 问题是标题仍未写入 CSV 文件
  • @JohnG 我已经添加了课程。请看

标签: c# csvhelper


【解决方案1】:

我猜你正在寻找这样的东西。这将从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 标头现在不按顺序排列。
  • 尝试Map(m =&gt; m.Header1).ConvertUsing(row =&gt; string.Join(",", row.Header1)).Index(0); 否则您可能必须按照您希望它们的顺序单独映射每列Map(m =&gt; m.Id); Map(m =&gt; m.Header2);,而不是使用AutoMap(CultureInfo.InvariantCulture);
  • @DavidSpecht 有没有办法将字符串列表写入具有相同标题名称的多个列?
  • @Farshan 在 GitHub 上查看我对您问题的回答。 github.com/JoshClose/CsvHelper/issues/…
  • @DavidSpecht 谢谢,我想我必须在循环中手动编写标题,因为字符串列表的长度是动态的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多