【问题标题】:Generate CSV with dynamic headers using CsvHelper使用 CsvHelper 生成带有动态标题的 CSV
【发布时间】:2020-10-18 11:25:59
【问题描述】:

我的数据库中有一条记录,我想生成 CSV,为此我正在使用 CsvHelper 库。下面给出了需要生成为 csv 的记录的数据结构。 观察者“additional_details”列,它包含一个 JSON 对象。应在 csv 输出中为每个唯一的 JSON 键添加一个新列。见下图

这就是我目前正在尝试做的事情:-

 My c# model

    public class Data 
    { 
        public bool ConfirmedAttendance {get; set;}
        public bool DigitalDelivery {get; set;}
        public string ProfileCode {get; set;}
        public ExpandoObject AdditionalDetails { get; set; }
    }

    So, I will be getting a `IList<Data> _data;` 


                using var stream = new MemoryStream();
                using var writer = new StreamWriter(stream);
                using var csvWriter = new CsvWriter(writer, System.Globalization.CultureInfo.CurrentCulture);
                csvWriter.Configuration.HasHeaderRecord = true;
                csvWriter.WriteHeader<Data>();
    
                   //A dictionary to hold each column and its value.
                    var _addintionalDetails = new Dictionary<string, string>();
                    
                  //populating the above dictionary with the unique json key.
                    foreach (var record in _data)
                    {
                        foreach (var item in (IDictionary<String, Object>)record.AdditionalDetails)
                        {
                            if(!_addintionalDetails.ContainsKey(item.Key))
                            {
                                _addintionalDetails.Add(item.Key, item.Value.ToString());
                            }
                        }
                    }

                  //Adding new column in the csv output from the above dictionary. 
                    foreach (var header in _addintionalDetails)
                    {
                        csvWriter.WriteField(header.Key.Humanize(LetterCasing.AllCaps));
                    }
                   
                    await csvWriter.NextRecordAsync();
    
                    //Adding records to my csv
                    foreach (var row in input.Records)
                    {
                       //How to add records for additional details ??
                        await AddRecordAsync(csvWriter, row);
                       
                    }
                    writer.Flush();
                    stream.Seek(0, SeekOrigin.Begin);
                    input.Stream = stream.ToArray();



        private static async Task AddRecordAsync(CsvWriter csvWriter, Data row)
        {
            csvWriter.WriteRecord<Data>(row);
           
            await csvWriter.NextRecordAsync();
        }

【问题讨论】:

    标签: c# csv export-to-csv csvhelper


    【解决方案1】:

    这是AddRecordAsync 的更新版本。您还需要将_addintionalDetails 传递给它。

    private static async Task AddRecordAsync(CsvWriter csvWriter, Data row, Dictionary<string, string> _addintionalDetails)
    {
        csvWriter.WriteRecord(row);
    
        var additional = row.AdditionalDetails as IDictionary<string, object>;
    
        foreach (var header in _addintionalDetails)
        {
            if (additional.ContainsKey(header.Key))
            {
                csvWriter.WriteField(additional[header.Key]);
            }
            else
            {
                csvWriter.WriteField(string.Empty);
            }
        }
    
        await csvWriter.NextRecordAsync();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      • 2016-08-15
      • 2014-03-04
      • 1970-01-01
      相关资源
      最近更新 更多