.NET C# 读写CSV及转换DataTable

目录

  • .NET C# 读写CSV及转换DataTable
    • 1. 依赖库
    • 2. CSVUtil
      • 2.1 CSV 转 DataTable
      • 2.2 DataTable 转 CSV 文本
      • 2.3 DataTable 转 CSV
      • 2.4 私有方法

.NET C# 读写CSV及转换DataTable

1. 依赖库

using System.Data;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;

2. CSVUtil

2.1 CSV 转 DataTable

/// <summary>
/// CSV 转 DataTable
/// </summary>
/// <param name="csvFilePath">CSV文件路径</param>
/// <param name="separator">间隔符,默认为","</param>
/// <returns>结果DataTable</returns>
public static DataTable? FromCSV(string csvFilePath, string separator = ",")
{DataTable dt = new DataTable();string separatorTemp = Guid.NewGuid().ToString().Replace("-", "");List<string[]?> lineArrayList = ReadCsvLines(csvFilePath, separator, separatorTemp);if (lineArrayList.Count < 1){return null;}int maxColumnCount = 0;lineArrayList.ForEach(l =>{if(l != null && l.Length > maxColumnCount){maxColumnCount = l.Length;}});string[]? headerLineArray = lineArrayList[0];for (int columnIdx = 0; columnIdx < maxColumnCount; columnIdx++){string? columnName = null;if (headerLineArray != null && headerLineArray.Length > columnIdx){columnName = headerLineArray[columnIdx]?.Trim('"')?.Replace(separatorTemp, separator);}if (string.IsNullOrEmpty(columnName)){columnName = $"column_{columnIdx + 1}";}string columnNameTemp = columnName;int tag = 0;while (dt.Columns.Contains(columnNameTemp)){columnNameTemp = $"{columnName}_{++tag}";}dt.Columns.Add(columnNameTemp);}for (int rowIdx = 1; rowIdx < lineArrayList.Count; rowIdx++){string[]? lineArray = lineArrayList[rowIdx];DataRow dataRow = dt.NewRow();for (int columnIdx = 0; columnIdx < maxColumnCount; columnIdx++){if (lineArray != null && lineArray.Length > columnIdx){dataRow[columnIdx] = lineArray[columnIdx]?.Trim('\"')?.Replace(separatorTemp, separator);}}dt.Rows.Add(dataRow);}return dt;
}

2.2 DataTable 转 CSV 文本

/// <summary>
/// DataTable 转 CSV 文本
/// </summary>
/// <param name="dt">DataTable实例</param>
/// <param name="separator">间隔符,默认为","</param>
/// <returns>CSV 文本</returns>
public static string ToCsvText(DataTable dt, string separator = ",")
{string csvText = string.Empty;string currentLine = string.Empty;for (int columnIdx = 0; columnIdx < dt.Columns.Count; columnIdx++){currentLine += $"\"{dt.Columns[columnIdx].ColumnName}\"{separator}";}currentLine = currentLine[..^separator.Length];csvText += currentLine;for (int rowIdx = 0; rowIdx < dt.Rows.Count; rowIdx++){currentLine = string.Empty;for (int columnIdx = 0; columnIdx < dt.Columns.Count; columnIdx++){currentLine += $"\"{dt.Rows[rowIdx][columnIdx]}\"{separator}";}currentLine = currentLine[..^separator.Length];csvText += Environment.NewLine + currentLine;}return csvText;
}

2.3 DataTable 转 CSV

/// <summary>
/// DataTable 转 CSV
/// </summary>
/// <param name="dt">DataTable实例</param>
/// <param name="csvFilePath">CSV文件路径</param>
/// <param name="separator">间隔符,默认为","</param>
/// <param name="cover">覆盖CSV文件,默认为True,若仅追加,则传False</param>
public static void ToCSV(DataTable dt, string csvFilePath, string separator = ",", bool cover = true)
{FileStream? fs = null;StreamWriter? sw = null;string csvText = ToCsvText(dt, separator);try{if (!File.Exists(csvFilePath) || cover){fs = new FileStream(csvFilePath, FileMode.Create, FileAccess.Write);sw = new StreamWriter(fs, Encoding.UTF8);}else{fs = new FileStream(csvFilePath, FileMode.Append, FileAccess.Write);sw = new StreamWriter(fs, Encoding.UTF8);sw.WriteLine();}sw.Write(csvText);}catch (Exception ex){// 异常处理...}finally{try { sw?.Close(); } catch { }try { fs?.Close(); } catch { }}
}

2.4 私有方法

private static List<string[]?> ReadCsvLines(string csvFilePath, string separator, string separatorTemp)
{FileStream? fs = null;StreamReader? sr = null;List<string[]?> lineArrayList = new List<string[]?>();try{fs = new FileStream(csvFilePath, FileMode.Open, FileAccess.Read);sr = new StreamReader(fs, Encoding.UTF8);string? currentLine = string.Empty;string[]? lineArray = null;while (!string.IsNullOrEmpty(currentLine = sr.ReadLine())){currentLine = currentLine.Trim();if (currentLine.Contains('"')){Regex regex = new Regex("\"(.*?)\"");MatchCollection matches = regex.Matches(currentLine);int offset = 0;foreach (Match match in matches.Cast<Match>()){Group group = match.Groups[1];if (group.Value.Contains(separator)){string replaceText = group.Value.Replace(separator, separatorTemp);currentLine = currentLine.Remove(group.Index + offset, group.Length);currentLine = currentLine.Insert(group.Index + offset, replaceText);offset = offset + replaceText.Length - group.Length;}}}lineArray = currentLine.Split(separator);lineArrayList.Add(lineArray);}}catch (Exception ex){// 异常处理...}finally{try { sr?.Close(); } catch { }try { fs?.Close(); } catch { }}return lineArrayList;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/30053.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

eclipse宝刀未老

Theia 是一个高度可定制的、开源的、基于 Web 的集成开发环境&#xff08;IDE&#xff09;框架。它由 Eclipse Foundation 主导&#xff0c;旨在为云和本地环境提供现代化的、全功能的 IDE 解决方案。Theia 的核心目标是提供一个灵活的平台&#xff0c;开发者可以根据自己的需求…

睡眠脑电 | 多导睡眠图技术

摘要 多导睡眠图(PSG)一词由Holland等人于1974年提出&#xff0c;用于描述在睡眠期间同时记录、分析和解释多个生理特征。PSG是诊断睡眠障碍患者和增进我们对正常睡眠认识的重要工具。这是一个复杂的过程&#xff0c;应由训练有素的技术人员执行。本文回顾了多导睡眠图(PSG)的…

头歌----恶意流量监测

第一关&#xff1a;RE库的使用 任务描述 本关任务&#xff1a;编写一个能正则匹配出 ip 地址的小程序。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; re 的主要功能函数&#xff1b;re.search 函数&#xff1b;例子。 re 的主要功能函数 常用的功能函…

【设计模式之基于特性的动态路由映射模式】

在ASP.NET Core中&#xff0c;路由是核心功能之一&#xff0c;用于将HTTP请求映射到相应的控制器操作。虽然“路由驱动设计模式”是一个我刚杜撰出来的设计模式名称&#xff0c;但我们可以基于ASP.NET Core的路由特性&#xff0c;构建一种以路由为中心的设计模式。 以下是一个…

C#.Net筑基-类型系统②常见类型

01、结构体类型Struct 结构体 struct 是一种用户自定义的值类型&#xff0c;常用于定义一些简单&#xff08;轻量&#xff09;的数据结构。对于一些局部使用的数据结构&#xff0c;优先使用结构体&#xff0c;效率要高很多。 可以有构造函数&#xff0c;也可以没有。因此初始…

独孤思维:副业闷声发财,没有多少人希望你好

01 做副业&#xff0c;一定要留有余地。 害人之心不可有&#xff0c;防人之心不可无。 很多人&#xff0c;喜欢晒收益&#xff0c;喜欢吹嘘多牛b。 被同行盯上&#xff0c;看着眼红&#xff0c;反手就各种搞事情。 独孤经历过&#xff0c;也看到过很多同行被搞过。 不要公…

阿里又出AI神器,颠覆传统图像编辑,免费开源!

文章首发于公众号&#xff1a;X小鹿AI副业 大家好&#xff0c;我是程序员X小鹿&#xff0c;前互联网大厂程序员&#xff0c;自由职业2年&#xff0c;也一名 AIGC 爱好者&#xff0c;持续分享更多前沿的「AI 工具」和「AI副业玩法」&#xff0c;欢迎一起交流~ 最近阿里开源了 Mi…

C#面:阐述 POCO 是什么意思

POCO是“Plain Old CLR Object”的缩写&#xff0c;意为“普通的旧CLR对象”。它是一种编程模式&#xff0c;用于描述一个简单的、纯粹的C#对象&#xff0c;没有任何特殊的依赖或框架限制。POCO对象通常只包含属性和方法&#xff0c;没有任何特殊的基类或接口。 在C#中&#x…

003.Linux SSH协议工具

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

国内 大数据平台

国内有多个类似阿里云天池大数据平台的数据集平台&#xff0c;这些平台主要提供开源数据集、数据竞赛、数据分析工具等资源&#xff0c;帮助数据科学家、研究人员和企业进行数据分析与机器学习开发。以下是一些较为知名的国内平台&#xff1a; 1. DataFountain&#xff08;Dat…

MySQL字符集与 排序规则 详解

在MySQL中&#xff0c;字符集&#xff08;Character Set&#xff09;和排序规则&#xff08;Collation&#xff09;是两个至关重要的概念&#xff0c;它们共同决定了数据库中数据的存储和检索方式。本文将详细解析MySQL中的字符集和排序规则&#xff0c;帮助读者更好地理解它们…

python中的特殊方法使用

__new__()构造器 范例&#xff1a;使用“__new__()”方法 # coding : utf-8class Message: # 默认object子类def __new__(cls, *args, **kwargs): # 特殊方法print("【new】cls %s、args %s、kwargs …

最新麻豆MDYS14源码 油条视频 苹果CMS系统 附搭建教程

在数字化的时代&#xff0c;视频网站已经成为人们获取娱乐和信息的主要渠道之一。而在众多的视频网站中&#xff0c;使用麻豆MDYS14源码搭建的网站无疑是最具有吸引力的。本文将为你介绍麻豆MDYS14源码的基本特性&#xff0c;以及如何利用它打造一款完美的视频网站。 首先&…

如何设计实现一个分布式注册中心

1、确定需求和目标 服务发现&#xff1a;客户端能够查找和连接到服务提供者。 负载均衡&#xff1a;将请求分发到不同的服务提供者实例上。 容错处理&#xff1a;能够处理服务提供者的故障&#xff0c;并确保系统的可用性和健壮性。 高可用性和可扩展性&#xff1a;能够处理…

记录一次mysql长事务的经历

目录 一.项目介绍 二.问题暴漏 三.问题排查 1.连接池方向 2.数据库方向 四.代码模拟 五.错误原因分析 1.MySQL参数优化 2.代码优化 六.总结 一.项目介绍 项目是springbootnacos的微服务架构,商城购物类系统,分多个服务,问题出现在众多服务中的单个服务 二.问题暴漏…

李光明从程序员到架构师的逆袭之路(四)

来上海已经第四天了&#xff0c;今天整日里雨丝绵绵&#xff0c;但这并未能阻挡我探索这座城市的热情。晚上&#xff0c;我和几位朋友相约一同出去逛逛&#xff0c;亲身感受上海这座国际一线城市的独特魅力。 上海&#xff0c;这座被誉为“东方明珠”的城市&#xff0c;以其独…

CAD二次开发(11)-在用C#进行CAD开发SQLite和SqlSugar的使用

1. System.Data.SQLite的使用 1.1 包的引入 利用 Nuget引入其相关包 1.2 App.config配置引入到CAD 因为我们当前的项目是类库项目&#xff0c;需要依托于宿主程序才可以运行&#xff0c;所以我们就得需要将SQLite自动生成的App.config里面的部分配置移植到CAD的配置文件中…

DC/AC电源模块:为医疗设备提供安全可靠的电力转换

BOSHIDA DC/AC电源模块&#xff1a;为医疗设备提供安全可靠的电力转换 DC/AC电源模块是一种用于将直流电源转换为交流电源的设备&#xff0c;广泛应用于各种医疗设备中。它们的主要功能是为医疗设备提供安全可靠的电力转换&#xff0c;以确保这些设备在工作过程中提供稳定的电…

一键破解禁止右键、破解禁止选择、破解禁止复制、破解禁止粘贴,启用复制,启用右键,启用选择,启用粘贴。

一键破解禁止右键菜单、破解禁止选择、破解禁止复制、破解禁止粘贴&#xff0c;启用复制&#xff0c;启用右键&#xff0c;启用选择&#xff0c;启用粘贴。 推荐一个右键功能复原的浏览器扩展神器TCCDE 因为chrome未在大陆运营&#xff0c;暂时未在其扩展市场发布该扩展 edg…

[python学习]--使用包来组织模块

使用包&#xff08;package&#xff09;来组织模块是Python中一种常见的代码组织方式&#xff0c;它可以帮助你更好地管理大型项目中的代码。以下是如何使用包来组织模块的步骤和注意事项&#xff1a; 创建包&#xff1a; 创建一个文件夹作为包的根目录&#xff0c;给文件夹起…