在 C# 中有效率地將 DataTable 轉換為 CSV 檔案
將DataTable轉換為CSV檔案是資料處理中的常見操作。 但是,處理不當可能會導致資料損壞,通常會導致每行的第一個儲存格內出現串聯值。本指南示範了正確的方法,避免常見的陷阱。
解決常見錯誤:
一個常見的錯誤是在每行末尾添加額外的逗號,導致資料錯位。 這個例子避免了這個問題。
最佳實作:
對於 .NET 4.0 及更高版本:
此最佳化的程式碼片段有效地將 DataTable 轉換為 CSV 檔案:
<code class="language-csharp">StringBuilder sb = new StringBuilder(); sb.AppendLine(string.Join(",", dt.Columns.Cast<DataColumn>().Select(column => column.ColumnName))); foreach (DataRow row in dt.Rows) { IEnumerable<string> fields = row.ItemArray.Select(field => field.ToString()); sb.AppendLine(string.Join(",", fields)); } File.WriteAllText("test.csv", sb.ToString());</code>
處理特殊字元(例如欄位內的逗號):
為了防止資料欄位中的逗號等特殊字元導致資料損壞,請使用此增強方法:
<code class="language-csharp">foreach (DataRow row in dt.Rows) { IEnumerable<string> fields = row.ItemArray.Select(field => string.Concat("\"", field.ToString().Replace("\"", "\"\""), "\"")); sb.AppendLine(string.Join(",", fields)); }</code>
此程式碼將每個欄位括在雙引號中,並轉義欄位中任何現有的雙引號。
改進的記憶體管理:逐行寫入:
對於非常大的DataTable,逐行寫入CSV可以提高記憶體效率:
<code class="language-csharp">using (var writer = new StreamWriter("test.csv")) { writer.WriteLine(string.Join(",", dt.Columns.Cast<DataColumn>().Select(column => column.ColumnName))); foreach (DataRow row in dt.Rows) { writer.WriteLine(string.Join(",", row.ItemArray.Select(field => string.Concat("\"", field.ToString().Replace("\"", "\"\""), "\"")))); } }</code>
這種方法避免了將整個 CSV 一次載入到記憶體中,使其適合處理海量資料集。 記得為 using
、System.Data
、System.IO
和 System.Linq
加入必要的 System.Text
語句。
以上是如何在 C# 中正確地將 DataTable 轉換為 CSV 檔案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!