C#实现DataTable与CSV互转工具类
在C#开发中,经常需要处理表格数据与文本文件之间的转换。本工具类提供了一套静态方法,用于实现System.Data.DataTable与CSV文件的双向转换,支持自定义表头设置,使用UTF-8编码以确保数据兼容性。
核心功能说明
该 CsvHelper 类主要包含两个静态方法,分别用于数据的导出和导入:
- dt2csv:将内存中的 DataTable 数据写入指定路径的 CSV 文件。
- csv2dt:读取指定路径的 CSV 文件,并将数据行追加到传入的 DataTable 实例中。
C# 代码实现
以下是完整的 C# 类代码。请注意,该类依赖 System.Data 和 System.IO 命名空间。在实际使用时,请确保引用了相应的程序集。
using System.Data;
using System.IO;
using System.Text;
namespace DotNet.Utilities
{
/// <summary>
/// CSV文件转换工具类
/// </summary>
public static class CsvHelper
{
/// <summary>
/// 将DataTable导出为Csv文件
/// </summary>
/// <param name="dt">源DataTable</param>
/// <param name="strFilePath">保存文件的物理路径</param>
/// <param name="tableheader">第一行显示的表头信息(可选)</param>
/// <param name="columname">第二行的字段标题,使用逗号分隔</param>
/// <returns>操作成功返回true,失败返回false</returns>
public static bool dt2csv(DataTable dt, string strFilePath, string tableheader, string columname)
{
try
{
// 使用UTF-8编码防止中文乱码
using (StreamWriter strmWriter = new StreamWriter(strFilePath, false, Encoding.UTF8))
{
// 写入自定义表头和列名
strmWriter.WriteLine(tableheader);
strmWriter.WriteLine(columname);
// 遍历DataTable的行
for (int i = 0; i < dt.Rows.Count; i++)
{
string strBufferLine = "";
// 遍历每一行的列
for (int j = 0; j < dt.Columns.Count; j++)
{
if (j > 0)
{
strBufferLine += ",";
}
// 处理空值情况
object val = dt.Rows[i][j];
strBufferLine += (val == null ? "" : val.ToString());
}
strmWriter.WriteLine(strBufferLine);
}
}
return true;
}
catch
{
return false;
}
}
/// <summary>
/// 将Csv文件内容读入DataTable
/// </summary>
/// <param name="filePath">Csv文件路径</param>
/// <param name="n">跳过的行数索引,表示第n+1行开始为数据记录(前n行为标题等)</param>
/// <param name="dt">用于接收数据的已定义结构的DataTable</param>
/// <returns>填充后的DataTable</returns>
public static DataTable csv2dt(string filePath, int n, DataTable dt)
{
using (StreamReader reader = new StreamReader(filePath, Encoding.UTF8, false))
{
int m = 0;
while (!reader.EndOfStream)
{
m++;
string line = reader.ReadLine();
// 跳过前n行(标题行),从第n+1行开始读取数据
if (m > n)
{
// 简单按逗号分割,实际复杂CSV可能需要解析引号包裹的字段
string[] split = line.Split(',');
if (split.Length > 0)
{
DataRow dr = dt.NewRow();
for (int i = 0; i < split.Length; i++)
{
if (i < dt.Columns.Count)
{
dr[i] = split[i];
}
}
dt.Rows.Add(dr);
}
}
}
}
return dt;
}
}
}
使用注意事项
- 数据结构匹配:调用
csv2dt时,传入的dt参数必须已经定义好Columns(列结构)。否则dt.NewRow()可能会报错或导致列索引越界。 - 编码格式:代码统一使用了
Encoding.UTF8。如果源CSV文件是GBK或其他编码,需在StreamReader构造函数中修改编码参数,否则可能出现乱码。 - 特殊字符处理:上述实现采用简单的
Split(',')进行分割。如果CSV字段内容本身包含逗号且被双引号包裹,这种简单分割方式可能不准确,生产环境中建议使用成熟的CSV解析库(如 CsvHelper NuGet包)。 - 资源释放:示例代码中添加了
using语句块来自动管理StreamWriter和StreamReader的资源释放,这比手动调用Close()更安全。
总结
这个C#类用于转换DataTable为CSV文件、CSV文件转换成DataTable,如果需要进行CSV和DataTable之间进行转换,使用这个类非常合适。希望本文所述的C#操作CSV文件的方法对大家的程序设计有所帮助。 以上就是C#实现DataTable与CSV互转工具类的详细内容,更多关于C# CSV文件操作的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













