C#读取TXT文件并逐行解析数据写入数据库

Ada
Ada
发布时间:2026-10-14 | 1人浏览过
原创

在C#开发中,经常需要将外部TXT数据导入关系型数据库。本示例演示如何使用 System.IO.StreamReader 逐行读取文本,利用字符串分割方法解析列数据,并将结果封装进 DataTable 对象,为数据库插入操作提供标准化的数据源。

核心实现思路

该方案主要依赖以下三个步骤:

  1. 文件流读取:通过 FileStream 打开文件,并使用指定编码(如UTF-8)的 StreamReader 进行流式读取,避免大文件内存溢出。
  2. 数据解析:调用 ReadLine() 获取单行文本,使用 Split() 方法根据特定分隔符(如逗号)将行内元素拆分到字符串数组中。
  3. 数据封装:创建 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及数据库交互的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表