使用CsvHelper生成具有动态标题的CSV

3
我在我的数据库中有一些记录,我想生成CSV文件,我正在使用CsvHelper库来实现。需要生成CSV的记录的数据结构如下所示。 enter image description here 观察"additional_details"列,它包含一个JSON对象。应该为每个唯一的JSON键在csv输出中添加一个新列。请参见下面的图片。 enter image description here

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

 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();
        }
1个回答

2

以下是更新版本的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();
}

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