using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; namespace Domain.Helpers { public class CsvBuilder { private readonly List<List<object>> Lines = new(); public void AddLine(params object[] data) => Lines.Add(data.ToList()); private static string SerializeCsvValue(object value) { var x = value; if (x is bool b) x = b ? 1 : 0; if (x is DateTime d) x = string.Join(" ", d.ToString("s").Split('T')); var strVal = Convert.ToString(x, CultureInfo.InvariantCulture); if (string.IsNullOrWhiteSpace(strVal)) return ""; if (NumberHelper.IsNumeric(x) || x is DateTime || x is bool) return $"\"{strVal.Replace("\"", "\"\"")}\""; // use \t as excel conversion trick see: https://superuser.com/a/704291/543593 return $"\"\t{strVal.Replace("\"", "\"\"")}\""; } public string Build(string separator = ";") { var sb = new StringBuilder(); sb.Append('\uFEFF'); // UTF-8 BOM for excel to display UTF-8 characters foreach (var line in Lines) sb.AppendLine(string.Join(separator, line.Select(SerializeCsvValue))); return sb.ToString(); } } }
612410cookie-checkC# Basic/Simple CSV builder