CSV是一种通用的、相对简单的文件格式,最广泛的应用是在程序之间转移表格数据,而这些程序本身是在不兼容的格式上进行操作的。那么,C#如何读取和写入csv格式文件呢?CSV数据格式并没有非常统一的标准 但是为了避免出错 我们在开发的时候统一格式是这样的:

"name","pwd","date"

"张三","123","2015-09-30"

接下来代码处理中默认格式都是这样的

为什么要用csv文件

这就涉及到数据互通的问题,有些程序支持的表格数据另一些程序并不见得支持,而csv格式的却被大多数的应用程序支持,所以在交换保存数据的时候是个不错的选择。

注意的点:
  • 文件处理完的时候一定记得关闭释放数据流 否则文件会被占用
  • csv并没有严格的标准,多人开发的时候必须规定好格式,统一开发
一、DataTable数据写入CSV文件
public static void SaveCSV(DataTable dt, string fullPath)//table数据写入csv
{System.IO.FileInfo fi = new System.IO.FileInfo(fullPath);if (!fi.Directory.Exists){fi.Directory.Create();}System.IO.FileStream fs = new System.IO.FileStream(fullPath, System.IO.FileMode.Create, System.IO.FileAccess.Write);System.IO.StreamWriter sw = new System.IO.StreamWriter(fs, System.Text.Encoding.UTF8);string data = "";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 = "";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);}sw.Close();fs.Close();
}

二、读取CSV文件到DataTable
public static DataTable OpenCSV(string filePath)//从csv读取数据返回table
{System.Text.Encoding encoding = GetType(filePath); //Encoding.ASCII;//DataTable dt = new DataTable();System.IO.FileStream fs = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);System.IO.StreamReader sr = new System.IO.StreamReader(fs, encoding);//记录每次读取的一行记录string strLine = "";//记录每行记录中的各字段内容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";}sr.Close();fs.Close();return dt;
}
/// 给定文件的路径,读取文件的二进制数据,判断文件的编码类型
/// <param name="FILE_NAME">文件路径</param>
/// <returns>文件的编码类型</returns>public static System.Text.Encoding GetType(string FILE_NAME)
{System.IO.FileStream fs = new System.IO.FileStream(FILE_NAME, System.IO.FileMode.Open, System.IO.FileAccess.Read);System.Text.Encoding r = GetType(fs);fs.Close();return r;
}/// 通过给定的文件流,判断文件的编码类型
/// <param name="fs">文件流</param>
/// <returns>文件的编码类型</returns>
public static System.Text.Encoding GetType(System.IO.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;System.IO.BinaryReader r = new System.IO.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;
}/// 判断是否是不带 BOM 的 UTF8 格式
/// <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;
}

三、修改文件名称
我们需要保存历史数据 或者实时的知道那个文件被修改 可以通过改变文件的名称 如加上当天的日期等等。
public static bool ChangeFileName(string OldPath, string NewPath)
{bool re = false;try {if (File.Exists(OldPath)) {File.Move(OldPath, NewPath);re = true;}}catch {re = false;}return re;
}

四、CSV文件的数据写入
直接在网页表单提交数据保存在csv文件中 直接写入文件
public static bool SaveCSV(string fullPath,string Data)
{bool re = true;try{FileStream FileStream = new FileStream(fullPath, FileMode.Append);StreamWriter sw = new StreamWriter(FileStream, System.Text.Encoding.UTF8);sw.WriteLine(Data);//清空缓冲区sw.Flush();//关闭流sw.Close();FileStream.Close();}catch {re = false;}return re;
}

C# CSV文件读写相关推荐

  1. Tensorflow csv文件读写与分批训练

    Tensorflow-1: csv文件读写与分批训练 原创 2017年04月29日 22:28:23 1509 今天尝试了一下读写csv文件并使用tensorflow训练数据,很方便. 程序训练的一个 ...

  2. [Python从零到壹] 三.语法基础之文件操作、CSV文件读写及面向对象

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  3. python2.7读取csv文件_13.1. csv — CSV 文件读写 — Python 2.7.18 文档

    13.1.csv - CSV 文件读写¶ 2.3 新版功能. The so-called CSV (Comma Separated Values) format is the most common ...

  4. c++怎么可以在二进制文件中读取带string的数据_文件处理 | csv文件读写

    欢迎关注公众号 学习资料不会少 文件处理 在我们做自动化测试的过程中,常常会将数据文件存放在csv或者Excel文件里边.这一章节内容将给大家介绍,如何使用python进行csv和Excel文件的处理 ...

  5. day08学习 Python文件函数、CSV文件读写

    文件函数 seek seek(参数1,参数2) - 能够将指针移动指定的偏移量 参数1:移动的偏移量,默认为0 参数2: 0 - 将指针移动到文件开头 ​ 1 - (默认)- 指针指向当前位置 ​ 2 ...

  6. python 写csv加锁_Python: 对CSV文件读写 和 Md5加密

    1. python 有专门的csv包,直接导入即可. import csv: 2. 直接使用普通文件的open方法 csv_reader=open("e:/python/csv_data/l ...

  7. r语言读取csv文件赋值gamma_tidyfst vs pandas(1):csv文件读写

    作者:黄天元,复旦大学博士在读,热爱数据科学与开源工具(R),致力于利用数据科学迅速积累行业经验优势和科学知识发现,涉猎内容包括但不限于信息计量.机器学习.数据可视化.应用统计建模.知识图谱等,著有& ...

  8. Python——CSV文件读写(CSV库)

    基本概念 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本).纯文本意味着该文件是一个字 ...

  9. 用CSV文件读写数据的两种方式(转)

    导读:有时候我们需要对收集的数据做统计,并在页面提供显示以及下载.除了对传统的excel存取之外,对CSV文件的存取也很重要.本文列出了这两种操作的详细代码. 代码: <?php $file = ...

  10. csv 文件读写乱码问题的一个简单解决方法

    公众号后台回复"图书",了解更多号主新书内容 作者:zhenguo 来源:Python与算法社区 你好,我是 zhenguo 今天扼要总结一个处理csv文件乱码问题,可能你有类似经 ...

最新文章

  1. MinIO分布式专题(第一章、一文教你搭建MinIO单机版)
  2. jquery 封装页面之间获取值
  3. 粤东农批项目座谈会 农业大健康·李喜贵:功能性农业差异化加工
  4. Android 设备的CPU类型(通常称为”ABIs”)
  5. 超级高铁Hyperloop进入新阶段,将在华盛顿破土动工!
  6. BGP——本地优先级选路+BGP路由水平分割机制(讲解+配置命令)
  7. 不想用鸿蒙系统怎么办,华为鸿蒙系统出大BUG!网友:这再也不是用户想要的鸿蒙系统...
  8. [c/c++]小议几个写缓冲区的函数
  9. Hibernate:Hibernate缓存策略详解
  10. 20200724每日一句
  11. matlab 支撑集,基于OMP算法的快速压缩感知图像重构
  12. Excel函数(4)日期、文本函数
  13. 重置计算机的网络配置是什么意思,电脑怎么重置网络设置 win10网络重置后连不上网怎么办...
  14. 【Java从零到架构师第③季】【30】SpringMVC-转发_重定向_路径问题总结
  15. 哒螨灵使用注意事项_哒螨灵的基础知识
  16. Mathmatica可视化
  17. canvas教程9-线型的属性
  18. MATLAB学习笔记2:MATLAB基础知识(下)
  19. python常见开源库整理
  20. 损益科目不进行结转导致的对账问题

热门文章

  1. 如何加强数字版权保护
  2. 应聘简历/邮件怎样写
  3. HASH和HMAC(7):SHA3-224/256/384/512算法原理
  4. vlan的三种划分方式、pvlan和网段(子网)的关系
  5. LINUX下 ssdp 实现
  6. oracle 查看表空间使用情况
  7. 星巴克公司员工股权激励机制
  8. 断言(assertion)的简介
  9. 敏感词过滤优化的解决方案
  10. js滚动到指定位置显示或隐藏元素