the following function will take the list of dictionary items to a comma separated csv string.
public string ConvertToCSV(List<Dictionary<string, string>> items)
{
if (!items.Any()) return string.Empty;
StringBuilder writer = new StringBuilder();
// Generating Header.
List<string> headers = items[0].Keys.Select(x => x).OrderBy(x => x).ToList();
writer.AppendLine(string.Join(", ", headers.Select(h => h)));
// Generating content.
foreach (var item in items)
writer.AppendLine(string.Join(", ", headers.Select(h => item[h])));
return writer.ToString();
}
public string ConvertToCSV(List<Dictionary<string, string>> items)
{
if (!items.Any()) return string.Empty;
StringBuilder writer = new StringBuilder();
// Generating Header.
List<string> headers = items[0].Keys.Select(x => x).OrderBy(x => x).ToList();
writer.AppendLine(string.Join(", ", headers.Select(h => h)));
// Generating content.
foreach (var item in items)
writer.AppendLine(string.Join(", ", headers.Select(h => item[h])));
return writer.ToString();
}
This comment has been removed by the author.
ReplyDeleteWarning! If your data contains comma (,) or quote (") characters, this will not produce the output you want. You can escape a comma by putting the data in quotes, and you can escape a quote literal by doubling it.
ReplyDeletepublic static string CsvFromDictionaries(
IEnumerable<IDictionary<string, string>> records)
{
var headers = records.FirstOrDefault()?.Keys ?? new string[] { };
var headerRow = headers.ToDictionary(h => h, h => h);
var rows = new[] { headerRow }.Concat(records).Select(record =>
{
var values = headers.Select(key =>
{
var value = record[key] ?? String.Empty;
value = value.Replace("\"", "\"\"");
if (value.Contains('"') || value.Contains(','))
{
value = '"' + value + '"';
}
return value;
});
return String.Join(",", values);
});
return String.Join("\n", rows);
}