다음의 짧은 버전은 Excel에서 잘 열립니다. 문제는 후행 쉼표 일 수 있습니다.
.net = 3.5
StringBuilder sb = new StringBuilder();
string[] columnNames = dt.Columns.Cast<DataColumn>().
Select(column => column.ColumnName).
ToArray();
sb.AppendLine(string.Join(",", columnNames));
foreach (DataRow row in dt.Rows)
{
string[] fields = row.ItemArray.Select(field => field.ToString()).
ToArray();
sb.AppendLine(string.Join(",", fields));
}
File.WriteAllText("test.csv", sb.ToString());
.net> = 4.0
Tim이 지적했듯이 .net> = 4에 있으면 더 짧게 만들 수 있습니다.
StringBuilder sb = new StringBuilder();
IEnumerable<string> columnNames = dt.Columns.Cast<DataColumn>().
Select(column => column.ColumnName);
sb.AppendLine(string.Join(",", columnNames));
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());
Christian이 제안한대로 필드에서 이스케이프되는 특수 문자를 처리하려면 루프 블록을 다음과 같이 바꾸십시오.
foreach (DataRow row in dt.Rows)
{
IEnumerable<string> fields = row.ItemArray.Select(field =>
string.Concat("\"", field.ToString().Replace("\"", "\"\""), "\""));
sb.AppendLine(string.Join(",", fields));
}
마지막으로 csv 콘텐츠를 전체 문서가 아닌 한 줄씩 작성하여 메모리에 큰 문서가 생기지 않도록 할 수 있습니다.