CSVHelper: запись списка в CSV

#c# #csvhelper

#c# #csvhelper

Вопрос:

Я хочу знать, как записать список в CSV с помощью CSVHelper. Я взглянул сюда.

У меня есть следующие свойства в классе 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
  

Любая помощь была бы оценена.

Комментарии:

1. Здесь нужно указать имя файла using (var writer = new StreamWriter(@"c:test.csv"))

2. Header1 = "value1","value2" выглядит странно… как вы можете присвоить два строковых значения ОДНОЙ строке? Я предполагаю, что вы хотите Header1 = "value1, value2" ? Даже если Header1 это List<string> присваивание не будет работать. В этом случае вы хотели бы… Header1 = new List<string> { "value1","value2"} . Неясно, чего именно вы пытаетесь достичь.

3. @Andy Я добавил файл. Спасибо

4. @JohnG Проблема в том, что заголовок все еще не записан в файл CSV

5. @JohnG Я добавил класс. Пожалуйста, смотрите

Ответ №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. Спасибо за ваш ответ, Дэвид. Заголовок 1 теперь отображается в конце файла. Заголовки CSV теперь не в порядке.

2.Попробуйте, Map(m => m.Header1).ConvertUsing(row => string.Join(",", row.Header1)).Index(0); иначе вам, возможно, придется сопоставлять каждый столбец по отдельности Map(m => m.Id); Map(m => m.Header2); в том порядке, в котором вы хотите, чтобы они были, а не использовать AutoMap(CultureInfo.InvariantCulture);

3. @DavidSpecht Есть ли какой-либо способ записать список строк в несколько столбцов с одинаковым именем заголовка?

4. @Farshan Смотрите мой ответ на ваш вопрос на GitHub. github.com/JoshClose/CsvHelper/issues /…

5. @DavidSpecht спасибо, я думаю, мне придется писать заголовки вручную внутри цикла, поскольку длина списка строк является динамической.