当前位置: 首页 > news >正文

C#实现导入CSV数据到List<T>的完整教程

C#实现导入CSV数据到List<T>的完整教程

在C#应用程序开发中,经常需要从CSV文件中导入数据并转换为对象列表。本文将详细介绍如何使用C#实现将CSV数据导入到List<T>集合中。

一、功能概述

本实现主要包含以下功能:

  1. 通过文件对话框选择CSV文件

  2. 读取CSV文件内容到DataTable

  3. 处理不同编码格式的CSV文件

  4. 将DataTable数据转换为强类型对象列表

  5. 支持多种数据类型的自动转换

二、核心代码实现

1. 文件选择与导入事件处理

private void TsbImport_Click(object sender, EventArgs e)
{try{OpenFileDialog ofd = new OpenFileDialog();ofd.Filter = "CSV文件(*.csv)|*.csv|Excel97-2003 (*.xls)|*.xls";ofd.ValidateNames = true;ofd.CheckPathExists = true;ofd.CheckFileExists = false;if (ofd.ShowDialog() == DialogResult.OK){int success = 0;int error = 0;// 读取CSV文件到DataTableDataTable dataTable = FilePathToDataTable(ofd.FileName, 1);// 将DataTable转换为对象列表List<tb_xxx> partsList = DataTableToList<tb_xxx>(dataTable, dicDgvType);// 处理导入的数据...}}catch (Exception ex){// 异常处理MessageBox.Show($"导入失败: {ex.Message}");}
}

2. CSV文件读取方法

public static DataTable FilePathToDataTable(string filePath, int n = 1)
{FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);// 处理不同编码格式load:StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8, false);Encoding encoding = Encoding.UTF8;DataTable dt = new DataTable();try{int i = 0, m = 0;reader.Peek();while (reader.Peek() > 0){m = m + 1;string str = reader.ReadLine();// 检测并处理乱码if (str.Contains("�") || str.Contains("★") || str.Contains("╀") || str.Contains("??")){// 尝试不同编码switch (encoding.WebName){case "utf-8":encoding = Encoding.Default;break;case "GB2312":encoding = Encoding.ASCII;break;case "us-ascii":encoding = Encoding.UTF7;break;case "utf-7":encoding = Encoding.Unicode;break;default:throw new Exception("文件内容乱码");}goto load;}string[] split = str.Split(',');// 处理列标题if (m < n + 1){for (i = 0; i < split.Length; i++){dt.Columns.Add(split[i]);}}else // 处理数据行{DataRow dr = dt.NewRow();for (i = 0; i < split.Length; i++){dr[i] = split[i];}dt.Rows.Add(dr);}}}catch (Exception ex){dt = new DataTable();}finally{stream.Close();reader.Close();}return dt;
}

3. DataTable到List<T>的转换

public static List<T> DataTableToList<T>(DataTable dt, Dictionary<string, object> dicWhere) where T : new()
{List<T> listCollection = new List<T>(dt.Rows.Count);if (dt == null || dt.Rows.Count <= 0) return listCollection;// 获取T类型的属性信息PropertyInfo[] propertyInfoArray = typeof(T).GetProperties();string tempName = string.Empty;// 遍历DataTable的每一行foreach (DataRow dataRow in dt.Rows){T t = new T();// 遍历T类型的每个属性foreach (PropertyInfo propertyInfo in propertyInfoArray){tempName = propertyInfo.Name;tempName = dicWhere.Keys.Contains(tempName) ? dicWhere[tempName].ToString() : "";if (dt.Columns.Contains(tempName)){if (!propertyInfo.CanWrite) continue;try{object value = dataRow[tempName];Type type = propertyInfo.PropertyType;if (value != DBNull.Value){// 处理不同类型的数据转换if (value.GetType() == type){propertyInfo.SetValue(t, value, null);}else{// 处理各种数据类型的转换// 包括byte、short、int、long、decimal、double、float、DateTime、bool等// 详细代码见原始实现}}}catch (Exception ex){// 异常处理}}}listCollection.Add(t);}return listCollection;
}

三、使用示例

假设我们有一个tb_xxx类:

public class tb_xxx
{public int Id { get; set; }public string Name { get; set; }public decimal Price { get; set; }public DateTime CreateDate { get; set; }
}

使用字段映射字典:

Dictionary<string, object> dicDgvType = new Dictionary<string, object>
{{"Id", "编号"},{"Name", "名称"},{"Price", "价格"},{"CreateDate", "创建日期"}
};

四、注意事项

  1. 编码处理:CSV文件可能存在多种编码格式,代码中实现了自动检测和转换机制

  2. 数据类型转换:提供了丰富的数据类型转换支持,包括可空类型

  3. 异常处理:在各个关键步骤添加了异常处理,提高程序稳定性

  4. 性能优化:使用泛型和反射提高代码的复用性和灵活性

五、总结

本文介绍了如何使用C#将CSV文件数据导入到List<T>集合中的完整实现。通过文件对话框选择文件、读取CSV内容、处理编码问题、数据类型转换等步骤,实现了灵活高效的数据导入功能。开发者可以根据实际需求调整和扩展此代码,以适应不同的业务场景。

此实现具有良好的可扩展性和健壮性,可以作为数据导入功能的基础框架,应用于各种C#应用程序中。


文章转载自:

http://Af2JyfYp.gjwkL.cn
http://SxSrAlYU.gjwkL.cn
http://ClseQ7tl.gjwkL.cn
http://1Pt3hk9Y.gjwkL.cn
http://w6nQcevV.gjwkL.cn
http://rOs9iufc.gjwkL.cn
http://R3bNi6YW.gjwkL.cn
http://YANLHZvB.gjwkL.cn
http://giCeu65u.gjwkL.cn
http://TbTcl9h1.gjwkL.cn
http://ekTymfLc.gjwkL.cn
http://Fqyptanh.gjwkL.cn
http://GEqUXRUx.gjwkL.cn
http://SCSlbjrD.gjwkL.cn
http://Axpz4wXx.gjwkL.cn
http://O0CGP0Hh.gjwkL.cn
http://izI0GGmg.gjwkL.cn
http://1iLSyMRJ.gjwkL.cn
http://W9SOXDII.gjwkL.cn
http://m5t5sWlW.gjwkL.cn
http://KwEJgvEy.gjwkL.cn
http://u3pdCXuA.gjwkL.cn
http://YgkzmNB1.gjwkL.cn
http://aKOupo1x.gjwkL.cn
http://kM3P5sXg.gjwkL.cn
http://BOEEZUHs.gjwkL.cn
http://UpNbtLW1.gjwkL.cn
http://BcFnApqC.gjwkL.cn
http://2zNwNVaz.gjwkL.cn
http://nbzipR6p.gjwkL.cn
http://www.dtcms.com/a/369790.html

相关文章:

  • 安卓学习 之 按钮点击事件
  • Nmap网络扫描工具详细使用教程
  • 持续集成和持续交付 (CI/CD) 工具——Jenkins
  • 微信小程序携带token跳转h5, h5再返回微信小程序
  • ISO/IEC 27001 第八章 运行
  • 苍穹外卖项目实战(day-5完整版)-记录实战教程及问题的解决方法
  • GO语言的主要语法和特性
  • ubuntu 系統使用過程中黑屏問題分析
  • JavaScript 入门精要:从变量到对象,构建稳固基础
  • Go语言设计模式(三)抽象工厂模式
  • SDRAM-08 数据手册解读
  • [光学原理与应用-436]:晶体光学 - 各向同性与各向异性是描述材料物理性质随方向变化特性
  • python:如何生成 TA-Lib .whl 安装包?
  • AD渗透中服务账号相关攻击手法总结(Kerberoasting、委派)
  • 从Java全栈到Vue3实战:一次真实面试中的技术探索
  • python graphviz中文测试
  • 【VoNR】VoNR 不等于 VoLTE on 5G
  • 基于 GEE 批量下载 Landsat8 地表温度(LST)数据
  • 从“下山”到AI引擎:全面理解梯度下降(下)
  • Linux应用(2)——标准/目录IO
  • 问题三ai思路
  • 玳瑁的嵌入式日记D33-0905(IO多路复用)
  • GigaDevice(兆易创新)GD25Q64CSJGR 64Mbit FLASH
  • FEMDRW032G-88A19江波龙,工业级宽温EMMC存储FEMDRW032G采用eMMC5.1协议,具备32GB存储容量提供方案
  • Interior AI-AI驱动的室内设计工具
  • 裸机程序(3)
  • ai连接怡和达进行非标选型 抓包失败
  • 嵌入式系统学习Day31(多路IO复用)
  • vim 常用快捷键汇总
  • 1.进程与线程:区别、通信方式、同步方式