新闻中心

C# 怎么将 CSV 文件读取到 DataTable_C# CSV 文件读取 DataTable 方法

2025-11-11
浏览次数:
返回列表
答案:C#中读取CSV到DataTable可通过StreamReader逐行解析,首行作列名,后续为数据,适用于简单场景;注意编码、逗号转义及大文件性能问题,推荐CsvHelper处理复杂格式。

c# 怎么将 csv 文件读取到 datatable_c# csv 文件读取 datatable 方法

在 C# 中将 CSV 文件读取到 DataTable 是一个常见的需求,尤其在处理数据导入、报表生成等场景中。下面介绍一种简单、实用的方法,使用 StreamReader 逐行读取 CSV 并填充到 DataTable。

1. 基本思路说明

CSV 文件本质上是文本文件,每行代表一条记录,字段之间用逗号(或其他分隔符)分隔。我们可以通过读取第一行作为列名,后续每一行作为数据行,动态构建 DataTable。

以下是一个完整的示例方法:

using System;
using System.Data;
using System.IO;

public static DataTable ReadCsvToDataTable(string filePath, bool hasHeader = true)
{
    DataTable dataTable = new DataTable();
    string[] lines = File.ReadAllLines(filePath, Encoding.UTF8);

    if (lines.Length == 0)
        return dataTable;

    // 解析列名(第一行为表头)
    string[] headers = lines[0].Split(',');
    foreach (string header in headers)
    {
        dataTable.Columns.Add(hasHeader ? header.Trim() : $"Column{dataTable.Columns.Count}");
    }

    // 从第2行开始读取数据
    int startRow = hasHeader ? 1 : 0;
    for (int i = startRow; i < lines.Length; i++)
    {
        string line = lines[i].Trim();
        if (string.IsNullOrEmpty(line)) continue;

        string[] data = line.Split(',');
        DataRow row = dataTable.NewRow();

        // 防止数据列数与列定义不匹配
        for (int j = 0; j < data.Length && j < headers.Length; j++)
        {
            row[j] = data[j].Trim();
        }

        dataTable.Rows.Add(row);
    }

    return dataTable;
}

2. 使用注意事项

上述方法适用于简单的 CSV 格式,但实际使用中需注意以下几点:
  • 编码问题:确保文件编码为 UTF-8,否则中文可能出现乱码。可替换 Encoding.Default 或根据实际情况调整。
  • 字段包含逗号:如果字段内容本身包含逗号(如 "Smith, John"),需要用引号包裹。上面的 Split(',') 无法正确处理,建议使用更健壮的库。
  • 性能考虑:对于大文件,File.ReadAllLines 会一次性加载全部内容到内存,可能影响性能。推荐使用 StreamReader.ReadLine() 逐行读取。

3. 推荐使用 CsvHelper(高级场景)

对于复杂 CSV 处理(如带引号字段、多分隔符、类型映射等),推荐使用开源库 CsvHelper

安装方式(NuGet):

千鹿Pr助手 千鹿Pr助手

智能Pr插件,融入众多AI功能和海量素材

千鹿Pr助手 128 查看详情 千鹿Pr助手
Install-Package CsvHelper

示例代码:

```csharp using CsvHelper; using System.Globalization;

// 需要定义类映射,或使用 dynamic + DataTable 扩展 // CsvHelper 更适合映射到对象,但也可配合 DataTable 使用

<H3>4. 简化版 StreamReader 实现(适合大文件)</H3>
<font>避免内存溢出,适合读取较大的 CSV 文件:</font>

```csharp
public static DataTable ReadCsvViaStream(string filePath, bool hasHeader = true)
{
    DataTable table = new DataTable();
    using (var reader = new StreamReader(filePath, Encoding.UTF8))
    {
        string line;
        int lineNumber = 0;

        while ((line = reader.ReadLine()) != null)
        {
            if (lineNumber == 0)
            {
                string[] headers = line.Split(',');
                foreach (string h in headers)
                    table.Columns.Add(h.Trim());

                if (!hasHeader) AddDataRow(table, line.Split(','));
            }
            else if (hasHeader || lineNumber > 0)
            {
                AddDataRow(table, line.Split(','));
            }
            lineNumber++;
        }
    }
    return table;
}

private static void AddDataRow(DataTable table, string[] values)
{
    if (values.Length == 0) return;
    DataRow row = table.NewRow();
    for (int i = 0; i < values.Length && i < table.Columns.Count; i++)
    {
        row[i] = values[i].Trim();
    }
    table.Rows.Add(row);
}

基本上就这些。对于大多数简单场景,手动解析即可满足;若涉及复杂格式或大量数据,建议引入 CsvHelper 或其他专业库。

以上就是C# 怎么将 CSV 文件读取到 DataTable_C# CSV 文件读取 DataTable 方法的详细内容,更多请关注其它相关文章!


# csv  # 也可  # 分隔符  # 迭代  # 不安全  # 如何使用  # 或其他  # 适用于  # 是一个  # 推荐使用  # c#  # stream  # 编码  # 大文件  # 跨境电商营销推广考试题  # 网站建设架构书  # 精准营销推广方案设计  # 洗碗机营销推广方案  # 宝山营销推广平台有哪些  # seo优化标题字数  # 山西seo排名费用  # 余杭网站推广营销  # 观山湖seo哪家强  # 宣城网站推广哪家强些呢 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 海棠电脑版入口_通过电脑访问海棠官网阅读  Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明  如何优雅地解决Livewire文件上传难题?SpatieLivewireFilepond让一切变得简单  天眼查企业查询官网入口 天眼查官方网页版查询  2025俄罗斯Yandex最新入口 官方网站地址及浏览器下载指南  漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站  Typer应用中动态命令行参数的解析与处理  使用J*aScript检测输入元素是否包含在特定类中  outlook中文官网入口地址 outlook官方中文版直达首页链接  Win11网速慢怎么解决 Win11网络设置优化解除限速  抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站  抖音网页版快捷访问 抖音网页版网页版入口操作教程  c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  深入理解Go语言中的指针类型:以*string为例  红果短剧网页版官网入口 官方最新网址发布  qq游戏大厅官方下载_qq游戏免费下载安装入口  Angular响应式表单:实现提交后表单及按钮的禁用与只读化  Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧  lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法  铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则  QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台  b站如何看历史记录_b站观看历史找回方法  Go语言HTML解析:利用Goquery精准获取指定元素内容  Excel函数批量查找替换超快方法_Excel用REPLACE和FIND函数秒级替换  J*aScript中针对特定容器内图片动画的实现教程  QQ官网正版登录链接 QQ在线登录入口最新  AO3官方可用镜像 Archive of Our Own网页版最新入口  ACG动漫视频网入口 ACG动漫*免费正版观看地址  UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】  163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航  Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】  Golang并发任务中错误如何聚合_Golang goroutine error收集方式  京东单号查询入口_京东快递订单追踪入口  Composer如何在生产环境安全地执行composer update  FullCalendar 自定义按钮样式定制指南  如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略  EMS快递官网app_中国邮政速递物流手机客户端  Typer应用中灵活处理命令行参数的令牌化与解析  拼多多购物车商品数量无法修改如何处理 拼多多购物车操作优化方法  html5 app怎么运行环境_配html5 app运行环境【教程】  Lar*el表单中优雅地处理“返回”按钮以规避验证:最佳实践指南  Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持  优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法  Pyrogram与g4f集成:异步编程实践与常见错误解决  c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析  如何使用Node.js csv 包按条件移除含空字段的CSV记录  TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法  Android Studio计算器C键功能异常排查与修复教程  小米汽车11月交付量突破40000台!雷军:将继续努力 

搜索