【发布时间】: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