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 を 1 行ずつ書き込むとメモリ効率が向上します。
<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 中国語 Web サイトの他の関連記事を参照してください。