Handling Commas
For handling commas inside of values when using string.Format(...), the following has worked for me:
var newLine = string.Format("\"{0}\",\"{1}\",\"{2}\"", first, second, third ); csv.AppendLine(newLine);
So to combine it with Johan's answer, it'd look like this:
//before your loop var csv = new StringBuilder(); //in your loop var first = reader[0].ToString(); var second = image.ToString(); //Suggestion made by KyleMit var newLine = string.Format("\"{0}\",\"{1}\"", first, second); csv.AppendLine(newLine); //after your loop File.WriteAllText(filePath, csv.ToString());
Returning CSV File
If you simply wanted to return the file instead of writing it to a location, this is an example of how I accomplished it:
From a Stored Procedure
public FileContentResults DownloadCSV() { // I have a stored procedure that queries the information I need SqlConnection thisConnection = new SqlConnection("Data Source=sv12sql;User ID=UI_Readonly;Password=SuperSecure;Initial Catalog=DB_Name;Integrated Security=false"); SqlCommand queryCommand = new SqlCommand("spc_GetInfoINeed", thisConnection); queryCommand.CommandType = CommandType.StoredProcedure; StringBuilder sbRtn = new StringBuilder(); // If you want headers for your file var header = string.Format("\"{0}\",\"{1}\",\"{2}\"", "Name", "Address", "Phone Number" ); sbRtn.AppendLine(header); // Open Database Connection thisConnection.Open(); using (SqlDataReader rdr = queryCommand.ExecuteReader()) { while (rdr.Read()) { // rdr["COLUMN NAME"].ToString(); var queryResults = string.Format("\"{0}\",\"{1}\",\"{2}\"", rdr["Name"].ToString(), rdr["Address"}.ToString(), rdr["Phone Number"].ToString() ); sbRtn.AppendLine(queryResults); } } thisConnection.Close(); return File(new System.Text.UTF8Encoding().GetBytes(sbRtn.ToString()), "text/csv", "FileName.csv"); }
From a List
/* To help illustrate */ public static List<Person> list = new List<Person>(); /* To help illustrate */ public class Person { public string name; public string address; public string phoneNumber; } /* The important part */ public FileContentResults DownloadCSV() { StringBuilder sbRtn = new StringBuilder(); // If you want headers for your file var header = string.Format("\"{0}\",\"{1}\",\"{2}\"", "Name", "Address", "Phone Number" ); sbRtn.AppendLine(header); foreach (var item in list) { var listResults = string.Format("\"{0}\",\"{1}\",\"{2}\"", item.name, item.address, item.phoneNumber ); sbRtn.AppendLine(listResults); } } return File(new System.Text.UTF8Encoding().GetBytes(sbRtn.ToString()), "text/csv", "FileName.csv"); }
StringBuilderand then make one save?Util.WriteCsv (mydatacollection, @"c:\temp\data.csv");