在C#中,将数据输出为CSV文件(逗号分隔值)有多种方法。以下是几种常见的方法及其优缺点和示例代码:
1. 使用 StringBuilder
优点:
- 简单易用。
- 对于小型数据集性能较好。
缺点:
- 对于大型数据集,内存占用较高。
- 手动处理特殊字符(如逗号、换行符)较为繁琐。
示例代码:
csharp
using System;
using System.IO;
using System.Text;
class Program
{
static void Main(string[] args)
{
var data = new List<string[]>
{
new string[] { "Name", "Age", "City" },
new string[] { "Alice", "30", "New York" },
new string[] { "Bob", "25", "Los Angeles" },
new string[] { "Charlie", "35", "Chicago" }
};
StringBuilder sb = new StringBuilder();
foreach (var row in data)
{
sb.AppendLine(string.Join(",", row));
}
File.WriteAllText("output.csv", sb.ToString());
}
}
2. 使用 CsvHelper
库
优点:
- 功能强大,支持复杂的CSV格式。
- 自动处理特殊字符(如逗号、换行符)。
- 支持自定义分隔符和格式。
缺点:
- 需要安装第三方库。
- 相对其他简单方法,学习曲线稍陡。
示例代码: 首先,安装 CsvHelper
库:
sh
Install-Package CsvHelper
然后,使用 CsvHelper
写入CSV文件:
csharp
using System;
using System.Globalization;
using System.IO;
using CsvHelper;
class Program
{
static void Main(string[] args)
{
var data = new List<Student>
{
new Student { Name = "Alice", Age = 30, City = "New York" },
new Student { Name = "Bob", Age = 25, City = "Los Angeles" },
new Student { Name = "Charlie", Age = 35, City = "Chicago" }
};
using (var writer = new StreamWriter("output.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
csv.WriteRecords(data);
}
}
}
class Student
{
public string Name { get; set; }
public int Age { get; set; }
public string City { get; set; }
}
3. 使用 TextFieldParser
和 TextFieldWriter
优点:
- 内置在 .NET Framework 中,无需额外安装库。
- 支持复杂的CSV格式。
- 适合处理大型文件。
缺点:
- 只在 .NET Framework 中可用,.NET Core 和 .NET 5+ 中没有内置
TextFieldParser
。 - 手动处理特殊字符较为繁琐。
示例代码:
csharp
using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.VisualBasic.FileIO;
class Program
{
static void Main(string[] args)
{
var data = new List<string[]>
{
new string[] { "Name", "Age", "City" },
new string[] { "Alice", "30", "New York" },
new string[] { "Bob", "25", "Los Angeles" },
new string[] { "Charlie", "35", "Chicago" }
};
using (var writer = new StreamWriter("output.csv"))
using (var tfp = new TextFieldParser(writer))
{
tfp.TextFieldType = FieldType.Delimited;
tfp.SetDelimiters(",");
foreach (var row in data)
{
tfp.WriteFields(row);
}
}
}
}
4. 使用 StreamWriter
和手动处理
优点:
- 简单易用。
- 对于小型数据集性能较好。
缺点:
- 对于大型数据集,内存占用较高。
- 手动处理特殊字符(如逗号、换行符)较为繁琐。
示例代码:
csharp
using System;
using System.Collections.Generic;
using System.IO;
class Program
{
static void Main(string[] args)
{
var data = new List<string[]>
{
new string[] { "Name", "Age", "City" },
new string[] { "Alice", "30", "New York" },
new string[] { "Bob", "25", "Los Angeles" },
new string[] { "Charlie", "35", "Chicago" }
};
using (var writer = new StreamWriter("output.csv"))
{
foreach (var row in data)
{
writer.WriteLine(string.Join(",", row));
}
}
}
}
总结
StringBuilder
:适用于小型数据集,简单易用,但内存占用较高。CsvHelper
:功能强大,支持复杂格式,自动处理特殊字符,但需要安装第三方库。TextFieldParser
和TextFieldWriter
:内置在 .NET Framework 中,适合处理大型文件,但在 .NET Core 和 .NET 5+ 中不可用。StreamWriter
和手动处理:简单易用,适用于小型数据集,但需要手动处理特殊字符。
选择哪种方法取决于你的具体需求,包括数据集的大小、复杂性以及是否需要处理特殊字符。