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文件的过程可以分解为几个步骤:
创建流式写入器: 首先,您需要创建一个StreamWriter对象,它将充当CSV文件的流式写入器。您可以使用using语句自动处理流的打开和关闭,从而简化代码。
**写入
写入数据行: 接下来,您可以使用循环逐行写入数据行。对于每行数据,您需要将每个值作为单独的字段写入,并使用逗号分隔它们。
格式化数据: 在写入数据时,您可能需要对数据进行格式化,以便正确显示。例如,您可能需要对日期和数字应用特定的格式。
关闭流式写入器: 最后,您需要关闭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{}}}} }}
}