c# - 使用 CsvHelper 生成带有动态 header 的 CSV

标签 c# csv export-to-csv csvhelper

我的数据库中有一条记录,我想生成 CSV,为此我正在使用 CsvHelper 库。下面给出了需要生成为 csv 的记录的数据结构。 enter image description here 观察者“additional_details”列,它包含一个 JSON 对象。应在 csv 输出中为每个唯一的 JSON 键添加一个新列。见下图 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();
        }

最佳答案

这是 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();
}

关于c# - 使用 CsvHelper 生成带有动态 header 的 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62618814/

相关文章:

php - 当我将查询结果导出到 Excel CSV 时,始终显示 HTML 代码

mysql - SSIS:导出和导入带有特殊字符的CSV文件

c# - 根据条件将 list1 属性复制到 list2

c# - 如何在 Visual Studio 扩展的属性窗口对象列表中修改名称

c# - 将多个 CSV 文件中的数据导入到 Excel 工作表中

javascript - D3 CSV 列空间解析

c# - 建模 "I' m a * 但我也是一个 **”

C# - HttpWebRequest POST(登录 Facebook)

python - 使用python合并多个CSV文件

python - (Python) 使用 UTF-8 编码将字符串写入 CSV