2012-06-12 63 views
4

我的一個動作輸出一個csv文件。問題是如果一個字段包含逗號,那麼它將數據行分成兩個字段。我嘗試使用「\」」包括雙引號中的每一行,但是這是行不通的。可能有人指導我在正確的方向?使用包含逗號的數據寫入MVC中的csv

UPDATE

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"); 

當我現在運行它,我得到一個錯誤:對象引用未設置爲對象的實例

+0

CSV處理程序如何處理此問題?這是你的要求應該回答的問題。 – jrummell

+0

[還有另一個關於SO的問題,包括寫出CSV](http://stackoverflow.com/questions/1684667/writing-a-csv-file-in-net),當列包含逗號(和引號)時。 – 48klocs

+0

您可能不應該修改現有的問題,試圖獲得不同問題的答案。在您的特定情況下,以下情況之一爲真:model爲null,model.SurveyWinnerDetails中的項目爲null,或者通過p.Something爲null所收集的某個屬性。 –

回答

1

沒有任何「官方」CSV格式,儘管最常見的是RFC 4180(http://tools.ietf.org/html/rfc4180)根據該RFC(第6節),包含逗號的字段應用雙引號括起來。

根據@Axam的觀察,RFC 4180不允許在逗號周圍留出額外的空白。將您的格式字符串更改爲:

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

問題是他的單元格分隔逗號和雙引號後的空格。 –

+0

就是你,Axam ...我正在更新我的答案以反映這一點。 –

+0

謝謝伊桑。你的解決方案修復了它我添加了「\」「+ model.SurveyWinnerDetails.Select(p => p.DealerName).First()+」\「」來處理包含逗號的數據。 – bladerunner

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數據。

相關問題