新闻中心
C# 怎么将 CSV 文件读取到 DataTable_C# CSV 文件读取 DataTable 方法
答案:C#中读取CSV到DataTable可通过StreamReader逐行解析,首行作列名,后续为数据,适用于简单场景;注意编码、逗号转义及大文件性能问题,推荐CsvHelper处理复杂格式。

在 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插件,融入众多AI功能和海量素材
128
查看详情
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台!雷军:将继续努力


2025-11-11
浏览次数:次
返回列表
[] 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);
}