c# Csv文件读写示例,如果文件存在追加写入

功能

        1.写入

        2.读取

导出文件效果

调用示例

注意示例中的ToDataTable()方法是自己的封装的扩展方法,源码在集合扩展方法-CSDN博客

private List<MarkDataModel> createMarkDataList(int count){var markDataModels = new List<MarkDataModel>();for (int i = 0; i < count; i++){markDataModels.Add(new MarkDataModel(){X = i + 1,Y = i + 1,Text = "Data" + i + "_" + DateTime.Now.ToString("HHmmssfff")});}return markDataModels;}/// <summary>/// 写入/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnWrite_Click(object sender, EventArgs e){var dataList = createMarkDataList(10);//var filePath = AppContext.BaseDirectory + @"WeldResultUpload\" + DateTime.Now.ToString("yyyyMMdd") + @"\" + Global.GlobalIns.MaterialsCodeCurrent + ".xlsx";string currentDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);currentDirectory += @"ResultUpload\" + DateTime.Now.ToString("yyyyMMdd") + ".csv";CsvHelper.SaveCSV(dataList.ToDataTable(), currentDirectory);var dataList2 = createMarkDataList(20);CsvHelper.SaveCSV(dataList2.ToDataTable(), currentDirectory);MessageBox.Show("导出完成");}

Csv文件帮助类

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.IO;namespace CSVWinFormsApp
{/// <summary>/// Csv文件帮助类/// </summary>public class CsvHelper{/// <summary>/// 写入CSV文件/// </summary>/// <param name="dt">要写入的数据表</param>/// <param name="fullPath">保存的文件路径,注意包含文件名</param>public static void SaveCSV(DataTable dt, string fullPath){try{FileInfo fi = new FileInfo(fullPath);//判断文件目录是否存在if (!fi.Directory.Exists){//如果目录不存在就创建目录fi.Directory.Create();}var isExists = File.Exists(fullPath);//FileMode.Append 如果文件存在追加写入using (FileStream fs = new FileStream(fullPath, FileMode.Append,FileAccess.Write)){StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8);string data = string.Empty;if (!isExists){for (int i = 0; i < dt.Columns.Count; i++)//写入列名{data += dt.Columns[i].ColumnName.ToString();if (i < dt.Columns.Count - 1){data += ",";}}sw.WriteLine(data);}for (int i = 0; i < dt.Rows.Count; i++) //写入各行数据{data = string.Empty;for (int j = 0; j < dt.Columns.Count; j++){string str = dt.Rows[i][j].ToString();str = str.Replace("\"", "\"\"");//替换英文冒号 英文冒号需要换成两个冒号if (str.Contains(',') || str.Contains('"')|| str.Contains('\r') || str.Contains('\n')) //含逗号 冒号 换行符的需要放到引号中{str = string.Format("\"{0}\"", str);}data += str;if (j < dt.Columns.Count - 1){data += ",";}}sw.WriteLine(data);}//使用了Using可以不手动关闭了。好买书还是关一下的好sw.Close();fs.Close();}}catch (Exception ex){}}/// <summary>/// 打开CSV文件/// </summary>/// <param name="filePath"></param>/// <returns></returns>public static DataTable OpenCSV(string filePath)//从csv读取数据返回table{System.Text.Encoding encoding = GetType(filePath); //Encoding.ASCII;//DataTable dt = new DataTable();try{using (FileStream fs = new FileStream(filePath, FileMode.Open,FileAccess.Read)){StreamReader sr = new StreamReader(fs, encoding);//记录每次读取的一行记录string strLine = string.Empty;//记录每行记录中的各字段内容string[] aryLine = null;string[] tableHead = null;//标示列数int columnCount = 0;//标示是否是读取的第一行bool IsFirst = true;//逐行读取CSV中的数据while ((strLine = sr.ReadLine()) != null){if (IsFirst == true){tableHead = strLine.Split(',');IsFirst = false;columnCount = tableHead.Length;//创建列for (int i = 0; i < columnCount; i++){DataColumn dc = new DataColumn(tableHead[i]);dt.Columns.Add(dc);}}else{aryLine = strLine.Split(',');DataRow dr = dt.NewRow();for (int j = 0; j < columnCount; j++){dr[j] = aryLine[j];}dt.Rows.Add(dr);}}if (aryLine != null && aryLine.Length > 0){dt.DefaultView.Sort = tableHead[0] + " " + "asc";}//使用了Using可以不手动关闭了。好买书还是关一下的好sr.Close();fs.Close();}}catch (Exception ex){}return dt;}/// <summary>/// 给定文件的路径,读取文件的二进制数据,判断文件的编码类型/// </summary>/// <param name="FILE_NAME">文件路径</param>/// <returns>文件的编码类型</returns>public static System.Text.Encoding GetType(string FILE_NAME){FileStream fs = new FileStream(FILE_NAME, FileMode.Open,FileAccess.Read);System.Text.Encoding r = GetType(fs);fs.Close();return r;}/// <summary>/// 通过给定的文件流,判断文件的编码类型/// </summary>/// <param name="fs">文件流</param>/// <returns>文件的编码类型</returns>public static System.Text.Encoding GetType(FileStream fs){byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 };byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 };byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //带BOMSystem.Text.Encoding reVal = System.Text.Encoding.Default;BinaryReader r = new BinaryReader(fs, System.Text.Encoding.Default);int i;int.TryParse(fs.Length.ToString(), out i);byte[] ss = r.ReadBytes(i);if (IsUTF8Bytes(ss) || (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF)){reVal = System.Text.Encoding.UTF8;}else if (ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00){reVal = System.Text.Encoding.BigEndianUnicode;}else if (ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41){reVal = System.Text.Encoding.Unicode;}r.Close();return reVal;}/// <summary>/// 判断是否是不带 BOM 的 UTF8 格式/// </summary>/// <param name="data"></param>/// <returns></returns>private static bool IsUTF8Bytes(byte[] data){int charByteCounter = 1;  //计算当前正分析的字符应还有的字节数byte curByte; //当前分析的字节.for (int i = 0; i < data.Length; i++){curByte = data[i];if (charByteCounter == 1){if (curByte >= 0x80){//判断当前while (((curByte <<= 1) & 0x80) != 0){charByteCounter++;}//标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X if (charByteCounter == 1 || charByteCounter > 6){return false;}}}else{//若是UTF-8 此时第一位必须为1if ((curByte & 0xC0) != 0x80){return false;}charByteCounter--;}}if (charByteCounter > 1){throw new Exception("非预期的byte格式");}return true;}}
}

集合数据Model

/// <summary>/// 打标数据 Model/// </summary>public class MarkDataModel{/// <summary>/// 坐标X/// </summary>[Description("坐标X")]//可以自定义中文列名public double X { get; set; }/// <summary>/// 坐标Y/// </summary>public double Y { get; set; }/// <summary>/// 打标数据/// </summary>public string Text { get; set; }}

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

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

相关文章

RTMP播放器延迟最低可以做到多少?

技术背景 RTMP播放器的延迟可以受到多种因素的影响&#xff0c;包括网络状况、推流设置、播放器配置以及CDN分发等。因此&#xff0c;RTMP播放器的延迟并不是一个固定的数值&#xff0c;而是可以在一定范围内变化的。 正常情况下&#xff0c;网上大多看到的&#xff0c;针对R…

小琳AI课堂:LLaMA 3.1 开源大模型的全新里程碑

引言 大家好&#xff0c;这里是小琳AI课堂&#xff01;今天我们要聊的是Meta最新发布的开源大模型LLaMA 3.1。这个版本在AI界掀起了不小的波澜&#xff0c;不仅在参数规模上有显著提升&#xff0c;还在多项性能上实现了突破。让我们一起来看看LLaMA 3.1带来的新变化和意义吧&a…

爆改YOLOv8|利用SCConv改进yolov8-即轻量又涨点

1&#xff0c;本文介绍 SCConv&#xff08;空间和通道重构卷积&#xff09;是一种高效的卷积模块&#xff0c;旨在优化卷积神经网络&#xff08;CNN&#xff09;的性能&#xff0c;通过减少空间和通道的冗余来降低计算资源的消耗。该模块由两个核心组件构成&#xff1a; 空间重…

PHP轻量级高性能HTTP服务框架 - webman

摘要 webman 是一款基于 workerman 开发的高性能 HTTP 服务框架。webman 用于替代传统的 php-fpm 架构&#xff0c;提供超高性能可扩展的 HTTP 服务。你可以用 webman 开发网站&#xff0c;也可以开发 HTTP 接口或者微服务。 除此之外&#xff0c;webman 还支持自定义进程&am…

Obsidian git sync error / Obsidian git 同步失敗

Issue: commit due to empty commit message Solution 添加commit資訊&#xff0c;確保不留空白 我的設置&#xff1a;auto-backup: {{hostname}}/{{date}}/

Scala尾递归解决爆栈问题

引言 我在上篇中详细的讲了递归的一系列问题&#xff0c;多路递归&#xff0c;爆栈问题&#xff0c;尾递归优化等&#xff0c;今天就实际演示一下尾递归是如何解决爆栈问题的&#xff0c;以及它的原理是什么&#xff1f; 支持尾递归优化的语言 尾递归是一种特殊的递归形式,如果…

SpringBoot开发——整合Logbook进行HTTP API请求响应日志输出

文章目录 1. 简介依赖管理2. 实战案例2.1 基本用法2.2 结合Logback日志记录到文件2.3 自定义核心类Logbook2.4 自定义日志输出Sink2.5 与RestTemplate集成1. 简介 记录HTTP API请求响应日志对于监控、调试和性能优化至关重要。它帮助开发者追踪API的使用情况,包括请求来源、参…

接口自动化测试推荐用什么框架?

在推荐接口自动化测试框架时&#xff0c;需要考虑多个因素&#xff0c;包括项目需求、技术栈、团队经验和个人偏好。 以下是几个常用的接口自动化测试框架供你参考&#xff1a; Postman&#xff1a; Postman是一个功能强大且易于上手的接口测试工具&#xff0c;它提供了许多…

景联文科技:专业数据标注公司,推动AI技术革新

数据标注作为AI技术发展的重要支撑&#xff0c;对于训练高质量的机器学习模型以及推动应用领域的创新具有不可替代的作用。 景联文科技作为专业的数据标注公司&#xff0c;致力于提供专业的数据标注服务&#xff0c;帮助客户解决AI链条中的数据处理难题&#xff0c;共同推动人工…

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、…

k8s的加密配置secret和应用配置configmap

目录 加密配置 secret的三种类型 创建opaque类型的两种方式 方法一 方法二 如何把secret挂载到pod当中 把secret作为环境变量传到pod当中 指定harbor私有仓库加密的secret配置 应用配置 configmap 创建configmap的方式 在pod里面用configmap做pod的环境变量 **用c…

Java项目: 基于SpringBoot+mybatis+maven校园资料分享平台(含源码+数据库+答辩PPT+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven校园资料分享平台 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简…

gdb 前端:kdbg 安装使用

文章目录 1. 前言2. kdbg 安装使用2.1 安装 kdbg2.2 使用 kdbg 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. kdbg 安装使用 2.1 安装 kdbg kdbg 是 gdb 的图形化界面的前端&#xff0c;在 …

如何使用Jmeter关联influxDB?

一、添加"添加后端监听器" 二、后端监听器实现选择&#xff0c;"org. apache. jmeter. visualizers. backend. influxdb.InfluxdbBackendlistenerClient" 三、修改"influxdbUrl&#xff1a;自己的主机、application:取一个项目名" 四、influxDB&…

网络层协议介绍

目录 一、网络层的功能 二、ip数据包格式 三、ICMP协议&#xff08;Internet控制报文协议&#xff09; 3.1功能 3.2 ping命令 3.2.1ping命令的用法 3.2.2扩展 3.3 tracert命令&#xff08;windows&#xff09; 四、arp协议 4.1ARP协议是如何工作的 4.2工作原理&#x…

可提示 3D 分割研究里程碑!SAM2Point:SAM2加持泛化任意3D场景、任意提示!

郑重声明&#xff1a;本解读已获得论文作者的原创解读授权 文章链接&#xff1a;https://arxiv.org/pdf/2408.16768 在线demo: https://huggingface.co/spaces/ZiyuG/SAM2Point code链接&#xff1a;https://github.com/ZiyuGuo99/SAM2Point 亮点直击 无投影 3D 分割&#xff1…

5G毫米波阵列天线仿真——CDF计算(手动AC远场)

之前写过两个关于阵列天线获取CDF的方法&#xff0c;一个通过Realized Gain&#xff0c;一个通过Power Flow&#xff0c; 三个案例中都是3D中直接波束扫描&#xff0c;并没有展示场路结合的情况。这期我们用Power Flow的方法&#xff0c;手动合并AC任务的波束计算CDF。 还是用…

SpringBoot的Web拦截器

拦截器与Filter的区别 首先拦截器(Intercepter)和过滤器&#xff08;Filter&#xff09;都是Web项目中针对Request请求的处理组件&#xff0c;在请求到达业务处理逻辑前&#xff0c;进行预处理&#xff0c;包括监控、安全相关的职责。 所处位置 首先SpringBoot的拦截器本质是…

Nature Communications 可远程操控食欲的口服软体机器人

肥胖对人群的的影响是深远的&#xff0c;它不仅关系到个人的健康&#xff0c;还与全球公共卫生挑战密切相关。据世界卫生组织的数据&#xff0c;全球每8人中就有1人患有肥胖症。肥胖增加了患2型糖尿病、心血管疾病、某些癌症等多种健康问题的风险&#xff0c;并对社会经济产生重…

【北京迅为】《STM32MP157开发板使用手册》-第十八章 Debian文件系统

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…