使用包含逗号的数据写入MVC中的csv

时间:2012-06-12 17:01:41

标签: c# asp.net-mvc-3

我的一个动作输出一个csv文件。问题是如果一个字段包含逗号,那么它将数据行分成两个字段。我尝试使用“\”“将每行包含在双引号中,但这不起作用。有人能引导我朝正确的方向发展吗?

更新

var sw = new StringWriter();
            sw.WriteLine(String.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13}", "First Name","Last Name","Address1","Address2","City","State","Postal Code","Country","Dealer ID","Dealer Name","Survey Source","Amount","Email","Survey Code"));
            sw.WriteLine(String.Format("\"{0}\",\"{1}\",\"{2}\",\"{3}\",\"{4}\",\"{5}\",\"{6}\",\"{7}\",\"{8}\",\"{9}\",\"{10}\",\"{11}\",\"{12}\",\"{13}\"",  model.SurveyWinnerDetails.Select(p => p.FirstName).First().Replace("\"", "\"\""),
                        model.SurveyWinnerDetails.Select(p => p.LastName).First().Replace("\"", "\"\""),
                        model.SurveyWinnerDetails.Select(p => p.Address1).First().Replace("\"", "\"\""),
                        model.SurveyWinnerDetails.Select(p => p.Address2).First().Replace("\"", "\"\""),
                        model.SurveyWinnerDetails.Select(p => p.City).First().Replace("\"", "\"\""),
                        model.SurveyWinnerDetails.Select(p => p.State).First().Replace("\"", "\"\""),
                        model.SurveyWinnerDetails.Select(p => p.PostalCode).First().Replace("\"", "\"\""),
                        model.SurveyWinnerDetails.Select(p => p.CountryCode).First().Replace("\"", "\"\""),
                        model.SurveyWinnerDetails.Select(p => p.DealerID).First().Replace("\"", "\"\""),
                        model.SurveyWinnerDetails.Select(p => p.DealerName).First().Replace("\"", "\"\""),
                        model.SurveyWinnerDetails.Select(p => p.SurveySource).First().Replace("\"", "\"\""),
                        model.SurveyWinnerDetails.Select(p => p.Amount).First().Replace("\"", "\"\""),
                        model.SurveyWinnerDetails.Select(p => p.Email).First().Replace("\"", "\"\""),
                        model.SurveyWinnerDetails.Select(p => p.SurveyCode).First().Replace("\"", "\"\"")));
            return File(new System.Text.UTF8Encoding().GetBytes(sw.ToString()), "text/csv", "SurveyWinner.csv");

当我现在运行时,我收到一个错误:对象引用未设置为对象的实例。

2 个答案:

答案 0 :(得分:2)

CSV文件使用与C#不同的转义。如果要在CSV文件中包含逗号,则需要使用双引号转义整个单元格。应该注意的是,这会产生在文本中加上双引号的次要问题!双引号加倍可以避免这个问题。

IE。此csv文件将显示为包含3列的单行:

This is a single cell,"This,is,a,single,cell", "This,is""a,single""cell"

尝试这样的事情:

sw.WriteLine(string.Format("\"{0}\",\"{0}\"", model.MyStringData1.Replace("\"", "\"\""));

请特别注意,我的双引号表示一个单元格立即跟在逗号之后,而在您的示例中,您有一个额外的空格。您需要删除此额外空间才能正确转义CSV数据。

答案 1 :(得分:1)

没有一种“官方”CSV格式,但最常见的是RFC 4180(http://tools.ietf.org/html/rfc4180)。根据该RFC(第6节),包含逗号的字段应该用双引号括起来。

Per @ Axam在下面的观察中,RFC 4180不允许在逗号周围留出额外的空格。将格式字符串更改为:

"{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13}"