コードの一例ではあるのですがDBから引っ張ってきた顧客等のデータをCSVに書き出したいとします。
現状はforeachで一件ずつエスケープ処理、ダブルクォーテーションのエスケープ処理、カンマのエスケープ処理等を行っている為、テーブルのフィールドやカラムが大量にあるとエクセルファイルへのエクスポートがとてつもなく時間がかかってしまいます。
var sb = new StringBuilder(); var columnList = customList.Columns.Select(column => { if (shouldLocalizeHeader) { return HtmlHelpers.LocalizedDisplayName(controllerName, column.DisplayName); } return column.DisplayName; }); sb.AppendLine(string.Join(",", columnList)); foreach (var item in customList.List) { var propertyList = customList.Columns.Select(column => ConvertCSVOutputFormat(item.GetType().GetProperty(column.Name).GetValue(item, null))); sb.AppendLine(string.Join(",", propertyList)); } Encoding enc = Encoding.GetEncoding("shift_jis"); using (var sw = new StreamWriter(fileName, false, enc)) { sw.WriteLine(sb.ToString()); } }
//エスケープ処理 public static string ConvertCSVOutputFormat(object value) { string csvValue = string.Empty; if (value != null) { csvValue = value.ToString(); if (csvValue.Contains("\n") || csvValue.Contains(",") || csvValue.Contains("\"")) { csvValue = csvValue.Replace(Environment.NewLine, "\n") .Replace("\"", "\"\""); csvValue = string.Format("\"{0}\"", csvValue); } } return csvValue; }
このforeachで一つのフィールドずつエスケープ処理を行っている箇所をまとめて処理したりして高速でエクスポートしたいのですがどのようなアプローチをとればよいのでしょうか?
宜しくお願い致します。

回答4件
あなたの回答
tips
プレビュー