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

C# 写入CSV文件和导出CSV文件总结

一、将DataTable数据导出到CSV文件

/// <summary>
/// 写入CSV
/// </summary>
/// <param name="fileName">文件名</param>
/// <param name="dt">要写入的datatable</param>
public static void WriteCSV(string fileName, DataTable dt)
{try{if (File.Exists(fileName)){File.Delete(fileName);}FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write);StreamWriter sw = new StreamWriter(fs, Encoding.UTF8);string data = "";if (dt.Columns.Count > 0) //有数据列时,才执行写入{//写出列名称for (int i = 0; i < dt.Columns.Count; i++){data += dt.Columns[i].ColumnName.ToString() + ",";//中间用,隔开}sw.WriteLine(data.Substring(0, data.Length - 1));//写出各行数据for (int i = 0; i < dt.Rows.Count; i++){data = "";for (int j = 0; j < dt.Columns.Count; j++){string strVal = dt.Rows[i][j].ToString();strVal = strVal.Replace("\"", "\"\"");  //将英文双引号替换成两个双引号//含逗号 双引号 换行符的需要放到引号中if (strVal.Contains(',') || strVal.Contains('"') || strVal.Contains('\r') || strVal.Contains('\n') || strVal.Contains('\t')){strVal = string.Format("\"{0}\"", strVal);}data += strVal + ",";//中间用,隔开}sw.WriteLine(data.Substring(0, data.Length - 1));}}sw.Close();fs.Close();}catch (Exception ex){ }
}

二、从CSV文件中将数据导出到DataTable

/// <summary>
/// 读取CSV文件
/// </summary>
/// <param name="filePath">文件路径</param>
public static DataTable ReadCSV(string filePath)
{try{DataTable dt = new DataTable();FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);StreamReader sr = new StreamReader(fs, Encoding.UTF8);string strLine = null; //记录每次读取的一行记录string[] arrayLine = null; //记录每行记录中的各字段内容//分隔符//string[] separators = { "," };//判断,若是第一次,建立表头,是否读取第一行bool isFirst = true;//逐行读取CSV文件while ((strLine = sr.ReadLine()) != null){strLine = strLine.Trim(); //去除头尾空格arrayLine = strLine.Split(','); //分隔字符串,返回数组int dtColumns = arrayLine.Length; //列的个数if (isFirst)  //建立表头{for (int i = 0; i < dtColumns; i++){dt.Columns.Add(arrayLine[i]); //每一列名称}isFirst = false;}else   //表内容{DataRow dr = dt.NewRow();//新建一行for (int j = 0; j < dtColumns; j++){dr[j] = arrayLine[j].Replace("\"\"", "\""); //将两个英文双引号替换回1个双引号}dt.Rows.Add(dr);//添加一行}}sr.Close();fs.Close();return dt;}catch (Exception ex){return null;}
}

C#导出数据到csv文件的通用类

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Lunz.Services.VFSCenter
{public class CSVHelper{public void DataToCsv(System.Data.DataTable dt, string strName){string strPath = strName;if (File.Exists(strPath)){File.Delete(strPath);}StringBuilder strColu = new StringBuilder();StringBuilder strValue = new StringBuilder();int i = 0;try{StreamWriter sw = new StreamWriter(new FileStream(strPath, FileMode.CreateNew), Encoding.GetEncoding("GB2312"));//先打印表头for (i = 0; i <= dt.Columns.Count - 1; i++){strColu.Append(dt.Columns[i].ColumnName);strColu.Append(",");}strColu.Remove(strColu.Length - 1, 1);//移除掉最后一个,字符sw.WriteLine(strColu);//再逐行打印行数据foreach (DataRow dr in dt.Rows){strValue.Remove(0, strValue.Length);//清空遗留数据for (i = 0; i <= dt.Columns.Count - 1; i++){strValue.Append(dr[i].ToString().Replace(",", ";"));strValue.Append(",");}strValue.Remove(strValue.Length - 1, 1);//移除掉最后一个,字符sw.WriteLine(strValue);}sw.Close();}catch (Exception ex){throw new Exception($"实体导出到Csv出错:{ex.Message}");}}}}

轻松实现数据导出:C#导出CSV文件的流式传输方法

在当今数据驱动的世界中,能够轻松地从应用程序中导出数据对于各种任务至关重要,从报告生成到数据分析。CSV(逗号分隔值)文件是一种简单但用途广泛的文件格式,常用于存储表格数据,使其易于导入各种软件和应用程序。

流式传输:提高CSV文件导出的效率

当您需要导出大型数据集时,使用流式传输技术可以显着提高效率。流式传输允许您逐行生成CSV文件,而不是将整个数据集加载到内存中。这对于处理内存受限的系统或需要处理不断增长的数据集的情况非常有用。

C#中CSV文件导出的步骤

使用C#导出CSV文件的过程可以分解为几个步骤:

  1. 创建流式写入器: 首先,您需要创建一个StreamWriter对象,它将充当CSV文件的流式写入器。您可以使用using语句自动处理流的打开和关闭,从而简化代码。

  2. **写入

  3. 写入数据行: 接下来,您可以使用循环逐行写入数据行。对于每行数据,您需要将每个值作为单独的字段写入,并使用逗号分隔它们。

  4. 格式化数据: 在写入数据时,您可能需要对数据进行格式化,以便正确显示。例如,您可能需要对日期和数字应用特定的格式。

  5. 关闭流式写入器: 最后,您需要关闭StreamWriter对象以释放系统资源并确保所有数据已写入CSV文件。

示例代码

以下代码示例演示了如何使用C#导出CSV文件:

using System;
using System.IO;namespace CSVExport
{class Program{static void Main(string[] args){// 创建数据源var data = new List<string[]>{new string[] { "Name", "Age", "City" },new string[] { "John", "25", "New York" },new string[] { "Mary", "30", "London" },new string[] { "Bob", "35", "Paris" }};// 创建CSV文件并写入标题using (var writer = new StreamWriter("data.csv")){writer.WriteLine(string.Join(",", data[0]));// 写入数据行for (int i = 1; i < data.Count; i++){writer.WriteLine(string.Join(",", data[i]));}}Console.WriteLine("CSV文件已导出!");}}
}

总结

通过使用C#中的流式传输技术,您可以轻松地从应用程序中导出大型CSV文件。流式传输允许您逐行生成文件,从而提高效率并减少内存使用。通过遵循本文中的步骤,您可以轻松地导出数据并生成格式良好的CSV文件,以便在其他应用程序中使用。

一、学习目标

实现用C# 写CSV文件,文件不存在就新建文件,若文件存在则在文件末尾追加数据不覆盖。

二、C# 新建CSV文件介绍

1、本人学习了两种新建CSV文件的方式,两种方法的命名空间都是System.IO,所以创建文件时先引入 using System.IO;具体实现方式如下:

using System.IO;      //要用的引入命名空间     string FileNamePath = @"D:\C# Projects\WriteCSV\writeCSVTest.csv"; //文件名路径//创建新文件方式一
if (!File.Exists(FileNamePath)) //如果文件不存在
{File.Create(FileNamePath).Close(); //先创建文件并关闭该文件,否则程序占用会导致文件没法被其他语句访问和读写操作   
}//创建新文件方式二
if (!File.Exists(FileNamePath)) 如果文件不存在
{FileInfo fileInfo = new FileInfo(FileNamePath); fileInfo.Create().Close(); //先创建文件并关闭该文件,否则程序占用会导致文件没法被其他语句访问和读写操作   
}

三、向CSV文件中写入数据

1、CSV文件是逗号分隔符文件,可以通过C# System.IO中的类StreamWriter里面的WriteLine()方法按行写入数据,若要把每行的数据分列,只需在写入的字符串格式数据的分隔处连接上英文逗号分隔符(“,”),如下先演示直接向CSV文件中写入三行四列数据。


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.IO.Pipes;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WriteCSV
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){string data = string.Empty;string FileNamePath = @"D:\C# Projects\WriteCSV\writeCSVTest.csv";if (!File.Exists(FileNamePath)){File.Create(FileNamePath).Close();FileStream fileStream = new FileStream(FileNamePath, FileMode.Create, FileAccess.Write); //实例化文件流类,并指定为创建模式和写StreamWriter streamWriter = new StreamWriter(fileStream, Encoding.UTF8); //实例化流写类,WriteLine()将以UTF8的编码方式写入数据for (int i = 0; i < 3; i++){data = Convert.ToString(i + 1) + "," + Convert.ToString(i * 2) + "," + Convert.ToString(i * 3) + "," + Convert.ToString(i * 4); //把字符串格式的数据用","连接起来以便写入CSV时按逗号分隔为4列streamWriter.WriteLine(data); //写入数据}streamWriter.Close(); //先关闭流写,写完一定要记得关闭,否则文件会被程序打开占用fileStream.Close(); //再关闭文件流写,写完一定要记得关闭,否则文件会被程序打开占用}}}
}

以上这种方式虽然能按预设的写入数据,但是有两个弊端。一个是只有for循环完毕后才写入数据,若循环次数很多且程序中途崩溃,那所有的数据都没能保存,只能重来,很浪费时间;另外必须在运行前确保自己的文件夹路径下没有相同文件名的文件,否则跑完也不会有数据。基于以上两点有一个相对完善的解决方案如下。

四、向CSV文件中写入数据且同一路径下有相同文件名存在时追加数据(不覆盖原有数据)

1、以两个for循环写入字符串数据i*j为例,以下方式可以解决第三大点内容提出的问题,而且添加try...catch语句能更好的避免程序运行过程中出现异常bug,最终的方式代码展示如下:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.IO.Pipes;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WriteCSV
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){string data = string.Empty;string FileNamePath = @"D:\C# Projects\WriteCSV\writeCSVTest.csv";for (int i = 1; i < 10; i++){for (int j = 1; j < 10; j++){data = Convert.ToString(i * j);//写入数据if (!File.Exists(FileNamePath)){try{FileStream fileStream = new FileStream(FileNamePath, FileMode.Create, FileAccess.Write); //实例化文件流类,并指定为创建模式和写StreamWriter streamWriter = new StreamWriter(fileStream, Encoding.UTF8); //实例化流写类,WriteLine()将以UTF8的编码方式写入数据streamWriter.WriteLine(Convert.ToString(data));  //写入数据streamWriter.Close();  //先关闭流写,写完一定要记得关闭,否则文件会被程序打开占用fileStream.Close();  //再关闭文件流写,写完一定要记得关闭,否则文件会被程序打开占用}catch{}}else{try{FileStream fileStream = new FileStream(FileNamePath, FileMode.Append, FileAccess.Write); //实例化文件流类,并指定为追加模式和写StreamWriter streamWriter = new StreamWriter(fileStream, Encoding.UTF8); //实例化流写类,WriteLine()将以UTF8的编码方式写入数据streamWriter.WriteLine(Convert.ToString(data)); streamWriter.Close(); //先关闭流写,写完一定要记得关闭,否则文件会被程序打开占用fileStream.Close(); //再关闭文件流写,写完一定要记得关闭,否则文件会被程序打开占用}catch{}}}} }}
}
http://www.dtcms.com/a/465602.html

相关文章:

  • 基于NVIDIA ORIN+FPGA+AI自动驾驶硬件在环注入测试
  • 怎么帮网站做支付接口王妃说此生不复相见
  • 虚幻基础:NPC制作
  • 智能眼镜行业腾飞在即,苹果/微美全息锚定“AR+AI眼镜融合”之路抢滩市场!
  • vue中慎用v-if和v-show导致不好排查无预期的错误和异常
  • Rokid JSAR 技术开发全指南:基于 Web 技术栈的 AR 开发实战
  • 顶尖高校读研经验-读研生活篇
  • 例点估算网站开发项目工作量推荐做任务网站
  • 【RH850F1KMS1】一文了解瑞萨MCU的芯片引脚标识名称
  • MPLS技术详解1:原理、架构与转发机制详析
  • WPF自定义控件之环形进度条
  • 深度学习入门(一)——从神经元到损失函数,一步步理解前向传播(下)
  • php网站怎么做伪静态织梦模板网站好吗
  • 电脑所有可用的网络接口
  • 宁波网站设计推广培训班呼和浩特做网站的
  • TensorFlow深度学习实战(40)——图神经网络(GNN)
  • 水库安全保障:单北斗GNSS变形监测系统的应用与维护探讨
  • Spring中Bean 的生命周期
  • 【C++】智能指针介绍
  • 利用腾讯混元大模型搭建Cherry Studio自有知识库,打造“智能第二大脑”
  • 咸阳做网站的公司有哪些电商卖货平台有哪些
  • 浏阳网站建设卷云网络做网页的it网站
  • 广东省省考备考(第一百二十天10.10)——资料分析、判断推理(强化训练)
  • 常用的C++压测框架
  • 强化学习之父 Richard Sutton :大模型是死路一条
  • 【YOLO 模型入门】(1)一文读懂 YOLO:从核心概念到检测原理
  • redis消息队列
  • AI任务相关解决方案21-一种基于大语言模型、多智能体协作平台MCP、Agent、RAG技术的项目投标智能化系统与方法
  • 做一个能注册用户的网站深圳优化网站公司
  • 哈尔滨seo建站怎么用wordpress建立自己的网站