LINQ query to CSV
The C# code below generates a CSV (comma separated value) string with the header row and data obtained from a LINQ query.
For example: A query like this:
dc.Users.Select(u => new
{
user_id = u.UserId,
username= u.Username,
first_name = u.FirstName,
last_name = u.LastName,
creation_date = u.CreationDate
});
Would result in a CSV string like this one:
user_id,username,first_name,last_name,creation_date "abf577a5-dc76-4719-9375-001a445d0c3d","jdoe","John","Doe",2011-03-29T14:50:28 "24b888cf-b02b-413e-8542-007e7ee572a6","jdoe2","John","Doe2",2009-05-29T19:52:32
And now to the code:
var users = dc.Users.Select(u => new
{
user_id = u.UserId,
username = u.Username,
first_name = u.FirstName,
last_name = u.LastName,
creation_date = u.CreationDate
}).ToArray();
var usersCsv = GenerateCsv(users);
And make sure the following methods are delcared:
/// <summary>
/// This method generates CSV data out an array of anything. The array
/// elements could be of anonymous type
/// </summary>
private string GenerateCsv(Array items)
{
var rowType = items.GetType().GetElementType();
var colNames = rowType.GetProperties().Select(p => p.Name).ToArray();
// create the header row
var retVal = new StringBuilder();
retVal.AppendLine(string.Join(",", colNames));
// now create the body
foreach (var row in items)
{
var rowItems = new string[colNames.Length];
for (int i = 0; i < colNames.Length; i++)
rowItems[i] = this.FormatCell(rowType.GetProperty(colNames[i]).GetValue(row, null));
retVal.AppendLine(string.Join(",", rowItems));
}
return retVal.ToString();
}
private string FormatCell(object item)
{
if (item == null)
return "";
if (item.GetType() == typeof(DateTime))
return ((DateTime)item).ToUniversalTime().ToString("s");
return "\"" + item.ToString().Replace("\"", "\"\"") + "\"";
}