4

私のアクションの1つは、csvファイルを出力します。問題は、フィールドにコンマが含まれている場合、データ行が2つのフィールドに分割されることです。「\」を使用して各行を二重引用符で囲んでみましたが、機能しません。誰かが正しい方向に案内してくれますか?

アップデート

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

これを今実行すると、エラーが発生します:オブジェクト参照がオブジェクトのインスタンスに設定されていません。

4

2 に答える 2

2

CSVファイルはC#とは異なるエスケープを使用します。CSVファイルにコンマを含める場合は、セル全体を二重引用符で囲む必要があります。これにより、テキストに二重引用符を付けるという2番目の問題が発生することに注意してください。この問題は、二重引用符を2倍にすることで回避できます。

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データを適切にエスケープするには、この余分なスペースを削除する必要があります。

于 2012-06-12T17:22:55.053 に答える
1

最も一般的なものはRFC4180(http://tools.ietf.org/html/rfc4180)で概説されていますが、「公式の」CSV形式はありません。そのRFC(セクション6)によると、コンマを含むフィールドは二重引用符で囲む必要があります。

以下の@Axamの観察によれば、RFC 4180は、コンマの周りに余分な空白を許可していません。フォーマット文字列を次のように変更します。

"{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13}"
于 2012-06-12T17:12:21.817 に答える