[英]Generate CSV with dynamic headers using CsvHelper
我的数据库中有一条记录,我想生成 CSV,为此我正在使用 CsvHelper 库。 需要生成为 csv 的记录的数据结构如下所示。 观察者“additional_details”列,它包含一个 JSON object。 应在 csv output 中为每个唯一的 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();
}
这是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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.