CSV文件有很多规则,主要是处理逗号(,)和双引号(")的方法不同,这里按Excel 规则解析转义字符。主要规则为:

1.有逗号(,)或开头为双引号(")的字符串在保存时前后加双引号,

2.若字符串前后加双引号,则将字符串内的双引号(如有)替换为两个双引号。

读取csv文件后放在DataTable内方便处理数据,可将csv文件首行作为DataTable列表头,也可自动生产列表头,完成后返回true。读取dataGridView后放在DataTable内方便处理数据,可将cdataGridView列表头作为首行,也可忽视列表头,完成后返回true。

加了文件打开的异常报警,主要分为四个函数模块:
        1.从csv文件读取数据到DataTable
        public static DataTable ReadDataFromCsv(string file, bool isFirst, out bool isok)

其中string file为csv文件名,bool isFirst为是否将首行设为列标题,out bool isok为读取成功标志。返回DataTable表(读取失败亦返回表)。

2.从DataGridView内读取数据到DataTable
        public static DataTable GetDgvToTable(DataGridView dgv, bool isFirst, out bool isok)

其中DataGridView dgv为DataGridView控件文件名,bool isFirst为是否将列标题设为首行,out bool isok为读取成功标志。返回DataTable表(读取失败亦返回表)。

3.从DataTable读取数据写入到csv文件
        public static bool WriteDataToCsv(DataTable dt, string fullPath, bool isFirst)

其中DataTable dt为DataTable表名,bool isFirst为是否将首行设为列标题。返回写入成功标志。

4.分析csv文件行内容(整行作为一个字符串),并按规则解析,返回字符串集合。

private static List<string> ReadValue(string line)

其中string line为要分割解析的字符串,返回 List<string>字符串列表

参考C#读取CSV文件_魏甲鑫的博客-CSDN博客_c#读取 csv解析思路。

参考C# CSV文件操作_000伊凡000的博客-CSDN博客_c# csv文件读取和写入思路。

直接上代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Forms;namespace 数据
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){bool isok;DataTable dt = ReadDataFromCsv(@"../../115.CSV", true, out isok);if (isok){dataGridView1.DataSource = dt.DefaultView;}}private void button2_Click(object sender, EventArgs e){bool isok;DataTable dt2 = GetDgvToTable(dataGridView1, true, out isok);if (isok){dataGridView2.DataSource = dt2;}isok = WriteDataToCsv(dt2, @"../../1115.CSV", true);}//string file为csv文件名,bool isFirst为是否将首行设为列标题,out bool isok为读取成功标志。返回DataTable表(读取失败亦返回表)。public static DataTable ReadDataFromCsv(string file, bool isFirst, out bool isok){DataTable dt = null;if (File.Exists(file)){dt = new DataTable();FileStream fs = null;StreamReader sr = null;try{fs = new FileStream(file, FileMode.OpenOrCreate, FileAccess.Read);sr = new StreamReader(fs, Encoding.Default);}catch{MessageBox.Show(file + "文件正在使用或打不开");isok = false;return dt;}try{string head = sr.ReadLine();List<string> valueList = ReadValue(head);if (isFirst == true)//列表题使用首行{for (int i = 0; i < valueList.Count; i++){dt.Columns.Add(valueList[i], typeof(string));//列表题使用首行}}else{for (int i = 0; i < valueList.Count; i++){dt.Columns.Add("Columns" + i.ToString(), typeof(string));//列表题自动生成}DataRow drHead = dt.NewRow();for (int n = 0; n < valueList.Count; n++){drHead[n] = valueList[n];         //添加首行}dt.Rows.Add(drHead);}while (!sr.EndOfStream){#region ==循环读取文件==string lineStr = sr.ReadLine();if (lineStr == null || lineStr.Length == 0)continue;List<string> valueList2 = ReadValue(lineStr);#region ==添加行数据==DataRow dr = dt.NewRow();for (int i = 0; i < valueList2.Count; i++){dr[i] = valueList2[i];}dt.Rows.Add(dr);#endregion}}catch{MessageBox.Show(file + "文件格式不对或内容为空");isok = false;return dt;}fs.Close();sr.Close();isok = true;#endregion}else{dt = new DataTable();MessageBox.Show(file + "文件不存在");isok = false;}return dt;}//分割解析字符串,string line为要分割解析的字符串,返回 List<string>字符串列表private static List<string> ReadValue(string line){var resList = new List<List<string>>();var valueList = new List<string>();var datas = line.Split(',');var queue = new Queue<string>();foreach (var data in datas){if (queue.Count <= 0){if (data.StartsWith("\"")){if (data.EndsWith("\"") && !data.EndsWith("\"\"") && data.Length >= 2)valueList.Add(DelESC(data.Substring(1, data.Length - 2)));elsequeue.Enqueue(data);}else{valueList.Add(data);}}else{if (data.EndsWith("\"") && !data.EndsWith("\"\"")){queue.Enqueue(data);valueList.Add(DelESC(GetStringByQueue(queue)));queue.Clear();}else if ((data.EndsWith("\"\"\"")) && !data.EndsWith("\"\"\"\"")){queue.Enqueue(data);valueList.Add(DelESC(GetStringByQueue(queue)));queue.Clear();}else{queue.Enqueue(data);}}resList.Add(valueList);}return valueList;}//从队列中拼接字符串并删去前后的<">private static string GetStringByQueue(Queue<string> queue){var str = "";if (queue.Count <= 0)return "";str += queue.Dequeue();for (var i = 0; queue.Count > 0; i++) str += "," + queue.Dequeue();str = str.Substring(1, str.Length - 2);return str;}//删去字符串中的转义,表格导出的csv中只有"被转义为""private static string DelESC(string str){var count = 0;var cs = new char[str.Length];for (var i = 0; i < str.Length; i++, count++){if (str[i] == '\"') i++;cs[count] = str[i];}return new string(cs, 0, count);}//DataTable dt为DataTable表名,bool isFirst为是否将首行设为列标题。返回写入成功标志。public static bool WriteDataToCsv(DataTable dt, string fullPath, bool isFirst){FileStream fs = null;StreamWriter sw = null;try{FileInfo fi = new FileInfo(fullPath);if (!fi.Directory.Exists){fi.Directory.Create();}fs = new FileStream(fullPath, FileMode.Create, FileAccess.Write);sw = new StreamWriter(fs, Encoding.UTF8);}catch{MessageBox.Show(fullPath + "文件正在使用或打不开");return false;}string data = "";if (isFirst == true)//列表题作为首行{for (int i = 0; i < dt.Columns.Count; i++){string str = dt.Columns[i].ColumnName.ToString();if (str.Contains(',') || str.StartsWith("\"")) //含逗号 开头双引号 的需要放到引号中{str = str.Replace("\"", "\"\"");//替换英文双引号 英文双引号需要换成两个双引号str = string.Format("\"{0}\"", str);}data += str;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();if (str.Contains(',') || str.StartsWith("\"")) //含逗号 开头双引号 的需要放到引号中{str = str.Replace("\"", "\"\"");//替换英文双引号 英文双引号需要换成两个双引号str = string.Format("\"{0}\"", str);}data += str;if (j < dt.Columns.Count - 1){data += ",";}}sw.WriteLine(data);}sw.Close();fs.Close();return true;}//DataGridView dgv为DataGridView控件文件名,bool isFirst为是否将列标题设为首行,out bool isok为读取成功标志。返回DataTable表(读取失败亦返回表)。public static DataTable GetDgvToTable(DataGridView dgv, bool isFirst, out bool isok){DataTable dt = new DataTable();if (dgv.RowCount == 0)//判断DataGridView控件是否为空{MessageBox.Show(dgv.Name + "为空,不能导出");isok = false;return dt;}int count1 = 0;if (isFirst == true)//列表题作为首行{// 列强制转换for (int count = 0; count < dgv.Columns.Count; count++){DataColumn dc = new DataColumn(dgv.Columns[count].Name.ToString());dt.Columns.Add(dc);count1 = 0;}}else  //列表第一行作为首行{// 列强制转换for (int countsub = 0; countsub < dgv.Columns.Count; countsub++){DataColumn dc = new DataColumn(Convert.ToString(dgv.Rows[0].Cells[countsub].Value));dt.Columns.Add(dc);count1 = 1;}}// 循环行for (int count = count1; count < dgv.Rows.Count; count++){DataRow dr = dt.NewRow();for (int countsub = 0; countsub < dgv.Columns.Count; countsub++){dr[countsub] = Convert.ToString(dgv.Rows[count].Cells[countsub].Value);}dt.Rows.Add(dr);}isok = true;return dt;}}
}

C#按Excel 规则读取、写入CSV文件,放入DataTable,再读取、写入dataGridView内。包含解析转义字符,首行判断,转换完成信号等。相关推荐

  1. python列表写入csv文件_将多个列表写入csv。Python中的文件

    我对Python(以及编程)还很陌生.我写了一个简短的程序,可以将一个专用文件夹的文件名读入字符串.在此之后,我将"提取"文件名中的信息(例如文档编号.标题等-&gt:在示 ...

  2. [转载] pythonpandas读取csv文件最后一行_简单小案例(一):使用Pandas在Python中读取和写入CSV文件...

    参考链接: 使用Pandas在Python中读写CSV文件 前期文章链接: YOLOv3论文 https://arxiv.org/pdf/1804.02767.pdf 正文: 有许多方法可以在Pyth ...

  3. 【Python入门教程】第73篇 写入CSV文件

    本篇我们介绍如何使用 Python 内置的 csv 模块将数据写入 CSV 文件. 写入 CSV 文件 在 Python 代码中写入 CSV 文件的步骤如下: 首先,使用内置的 open() 函数以写 ...

  4. python输出csv文件-Python之读取与写入CSV文件

    原标题:Python之读取与写入CSV文件 本文作者:闫续文 文字编辑:张梦婷 技术总编:张学人 有问题,不要怕!访问 CSV(Comma-Separated Values)格式是电子表格和数据库最常 ...

  5. csv java web 导入_DAY5-step9 使用CSV模块和Pandas在Python中读取和写入CSV文件

    什么是CSV文件? CSV文件是一种纯文本文件,其使用特定的结构来排列表格数据. CSV是一种紧凑,简单且通用的数据交换通用格式. 许多在线服务允许其用户将网站中的表格数据导出到CSV文件中. CSV ...

  6. csv文件python是怎么输入的,python怎么读取和写入csv文件

    Python读取与写入CSV文件需要导入Python自带的CSV模块,然后通过CSV模块中的函数csv.reader()与csv.writer()来进行CSV文件的读取与写入. 写入CSV文件impo ...

  7. 用python的pandas打开csv文件_使用CSV模块和Pandas在Python中读取和写入CSV文件

    什么是CSV文件? CSV文件是一种纯文本文件,其使用特定的结构来排列表格数据.CSV是一种紧凑,简单且通用的数据交换通用格式.许多在线服务允许其用户将网站中的表格数据导出到CSV文件中.CSV文件将 ...

  8. R语言:从 csv 文件中读取数据,然后将数据写入 csv 文件

    在 R 中,我们可以从存储在 R 环境外部的文件读取数据.我们还可以将数据写入将由操作系统存储和访问的文件中.R可以读取和写入各种文件格式,如csv,excel,xml等. 在本章中,我们将学习从 c ...

  9. pythonpandas读取csv文件最后一行_简单小案例(一):使用Pandas在Python中读取和写入CSV文件...

    前期文章链接: YOLOv3论文 https://arxiv.org/pdf/1804.02767.pdf 正文: 有许多方法可以在Python中读写CSV文件.有几种不同的方法,例如,您可以使用Py ...

最新文章

  1. java 下一代,什么是&QUOT;下一代插件&QUOT;对Java
  2. 如何在Mac OSX Yosemite中将Ruby版本2.0.0更新到最新版本?
  3. NotePad++编译代码
  4. 软工作业3—词频统计
  5. java中日期类型与字符串相互转换
  6. 前端(三)——HTML之表单
  7. java中的函数指的是,函数式接口在Java中是指有且仅有一个抽象方法的接口。( )...
  8. 织梦缩略图自动补齐绝对路径_织梦生成文章内容缩略图时自动加上绝对路径教程...
  9. 【渝粤教育】电大中专测量学 (4)作业 题库
  10. thinkphp5 一周学习总结 10月12日
  11. 溜达列表的鼠标HOVER变色
  12. MATLAB电话拨号音仿真,MATLAB电话拨号音的合成与识别
  13. 各种类型的电脑进入bios界面
  14. 2022年欧盟的寒冬,中国外贸企业送温暖(暖冬外贸商品都在这里)
  15. 递归解决年龄问题---c语言实现
  16. “舒适区”的科学原理:为什么走出舒适区这么难?
  17. iOS 中的渲染框架:CALayer 是显示的基础,存储 bitmap
  18. 战队口号霸气押韵8字_校园运动会加油霸气押韵口号文案 2020最有特色的运动会口号...
  19. 38:计算多项式的导函数
  20. Jarvis OJ -BASIC-WRITE-UP

热门文章

  1. Python在线聊天
  2. MFC如何修改窗口背景色(转载)
  3. 软考高项:信息系统项目管理师笔记-信息化和信息系统 (P2)
  4. English-全国英语翻译证书
  5. 小学数学计算机整合课后反思,2020小学数学教研组工作总结_小学数学教学反思心得五篇...
  6. sw标准件不能配置_sw标准件库调不出来(在使用solidworks2009标准件库 调不出零件)...
  7. 用html写个人简历(学生学习所用)
  8. 软件测试面试题之如何对web系统进行全面测试(持续更新中,求关注)
  9. 设计原则(5)-迪米特法则
  10. 科技类新闻快讯_新闻快讯—您可能使用了错误HTML。