C#读取TXT文件并逐行解析数据写入数据库
在C#开发中,经常需要将外部TXT数据导入关系型数据库。本示例演示如何使用 System.IO.StreamReader 逐行读取文本,利用字符串分割方法解析列数据,并将结果封装进 DataTable 对象,为数据库插入操作提供标准化的数据源。
核心实现思路
该方案主要依赖以下三个步骤:
- 文件流读取:通过
FileStream打开文件,并使用指定编码(如UTF-8)的StreamReader进行流式读取,避免大文件内存溢出。 - 数据解析:调用
ReadLine()获取单行文本,使用Split()方法根据特定分隔符(如逗号)将行内元素拆分到字符串数组中。 - 数据封装:创建
DataRow并将解析后的值赋值给对应索引位置,最后添加到DataTable中。待所有行读取完毕后,可将此DataTable批量写入数据库。
第1步:初始化文件读取流
首先定义文件路径,并实例化读取器。需注意设置正确的字符编码以防止乱码。
public void InputData()
{
// 定义待读取的TXT文件路径
string strFilePath = "e:\\output1.txt";
// 以只读模式打开文件流
using (FileStream fs = new FileStream(strFilePath, FileMode.Open, FileAccess.Read))
{
// 使用UTF-8编码初始化StreamReader
// 若文件为GBK/GB2312编码,可改为 System.Text.Encoding.Default
using (StreamReader sr = new StreamReader(fs, System.Text.Encoding.UTF8))
{
// 后续解析逻辑置于此处
}
}
}
注:现代C#推荐使用 using 语句块自动管理资源,确保即使发生异常也能正确关闭文件和读取器。
第2步:逐行读取与数据拆分
进入循环体,持续读取直到文件结束。对每一行内容执行分割操作。
string strLine0 = sr.ReadLine();
// 创建目标表结构(假设4列数据)
DataTable dt = new DataTable();
for (int i = 0; i < 4; i++)
{
dt.Columns.Add($"Col{i}");
}
// 当读取到空行时终止循环
while (strLine0 != null)
{
// 按全角逗号“,”或半角逗号","分隔元素
string[] strArray = strLine0.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
// 检查数组长度是否匹配预期列数,防止越界
if (strArray.Length == 4)
{
DataRow dr = dt.NewRow();
dr[0] = strArray[0];
dr[1] = strArray[1];
dr[2] = strArray[2];
dr[3] = strArray[3];
dt.Rows.Add(dr);
}
else
{
// 可根据需求记录错误行号或跳过
Console.WriteLine($"格式不匹配的行: {strLine0}");
}
// 读取下一行
strLine0 = sr.ReadLine();
}
第3步:数据写入数据库准备
此时 dt 中已包含所有解析后的有效数据。原demo中注释掉了直接的SQL拼接方式,因为动态拼接SQL存在注入风险且维护困难。建议采用参数化查询或ADO.NET的批量复制功能(如 SqlBulkCopy)进行高效入库。
// 示例:使用 SqlBulkCopy 快速写入(需引入 System.Data.SqlClient)
// using (SqlConnection conn = new SqlConnection("your_connection_string"))
// {
// conn.Open();
// using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn))
// {
// bulkCopy.DestinationTableName = "YourTableName";
// // 映射列名
// bulkCopy.ColumnMappings.Add("Col0", "Field1");
// bulkCopy.ColumnMappings.Add("Col1", "Field2");
// bulkCopy.ColumnMappings.Add("Col2", "Field3");
// bulkCopy.ColumnMappings.Add("Col3", "Field4");
// bulkCopy.WriteToServer(dt);
// }
// }
关键点与排错
- 编码问题:若读取中文出现乱码,请确认TXT文件的实际编码(通常为UTF-8或GB2312),并在
StreamReader构造函数中显式指定对应的Encoding对象。 - 分隔符统一:代码示例中使用的是全角逗号
‘,’,若原文档使用的是半角逗号‘,’,请调整Split方法的参数,否则无法正确分列。 - 边界检查:原始数据可能存在空行或列数不一致的情况,增加长度校验可有效避免
IndexOutOfRangeException。
总结
通过上述方法,可以实现C#程序对TXT文档的高效读取与结构化解析。结合 DataTable 和参数化数据库操作,能够构建稳定可靠的数据导入流程。以上就是C#逐行读取TXT数据并准备写入数据库的详细内容,更多关于C#文件IO及数据库交互的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













