C# Csv实现基本的读写和转换DataTable
海盗1234 人气:0Csv文件基本的属性
csv文件可以在excel或者wps中以表格形式打开,本质上是每一列以,
逗号为分隔符的一种格式,在C#中操作可以把他当做普通txt文本读入,然后通过处理,
逗号分隔符来对数据进行处理转换。
在表格中打开:
在记事本中打开:
Csv读写方式
方式一:一次性读写
使用File.ReadAllLines
一次性读入。File.WriteAllLines
一次性写入。
这种方式适合csv文件内容不多的情况下使用。
示例:
string path="data.csv"; var lines = File.ReadAllLines(path).ToList();
完整的实现:
/// <summary> /// 读取Csv,返回行集合 /// </summary> /// <param name="path"></param> /// <param name="hasTitle"></param> /// <returns></returns> public static List<string> ReadCsv(string path, bool hasTitle) { if (!File.Exists(path)) return new List<string>(); var lines = File.ReadAllLines(path).ToList(); if (hasTitle) { lines.RemoveAt(0); } return lines; }
方式二:使用文件流形式读写
使用StreamReader
,一行一行的读取文件中的内容,并且处理。写入类似
示例:
using (StreamReader sr = new StreamReader(path)) { string line; while ((line = sr.ReadLine()) != null) { //处理行数据 } }
Csv文件读写DataTable类型
将CSV文件读入数据转成DataTable类型
/// <summary> /// 读取Csv文件,加载到DataTable /// </summary> /// <param name="path">csv文件路径</param> /// <param name="hasTitle">是否有标题行</param> /// <param name="SafeLevel">安全等级:0:错误格式行正常添加;1:错误行忽略(不添加),2:出现错误弹出异常</param> /// <returns></returns> public static DataTable ReadCsvToDataTable(string path, bool hasTitle = false, int SafeLevel = 0) { DataTable dt = new DataTable(); var lines = ReadCsv(path, false); bool isFirst = true; foreach (var item in lines) { string[] values = item.Split(','); if (isFirst) { for (int i = 0; i < values.Length; i++) { dt.Columns.Add(); } if (hasTitle) { for (int i = 0; i < values.Length; i++) { dt.Columns[i].ColumnName = values[i]; } continue; } isFirst = false; } if (values.Length == dt.Columns.Count) { dt.Rows.Add(values); } else { switch (SafeLevel) { case 0: if (values.Length > dt.Columns.Count) { var res = values.ToList(); res.RemoveRange(dt.Columns.Count, values.Length - dt.Columns.Count); dt.Rows.Add(res.ToArray()); } else { dt.Rows.Add(values); } break; case 1: continue; default: throw new Exception("CSV格式错误:表格各行列数不一致"); } } } return dt; } /// <summary> /// 以文件流形式读取Csv文件,加载到DataTable /// </summary> /// <param name="path">csv文件路径</param> /// <param name="hasTitle">是否有标题行</param> /// <param name="SafeLevel">安全等级:0:错误格式行正常添加;1:错误行忽略(不添加),2:出现错误弹出异常</param> /// <returns></returns> /// <exception cref="Exception"></exception> public static DataTable ReadCsvByStream(string path, bool hasTitle = false, int SafeLevel = 0) { DataTable dt = new DataTable(); bool isFirst = true; using (StreamReader sr = new StreamReader(path)) { string line; while ((line = sr.ReadLine()) != null) { string[] values = line.Split(','); if (isFirst) { for (int i = 0; i < values.Length; i++) { dt.Columns.Add(); } isFirst = false; } //有表头则添加 if (hasTitle) { for (int i = 0; i < values.Length; i++) { dt.Columns[i].ColumnName = values[i]; } hasTitle = false; } else { if (values.Length == dt.Columns.Count) { dt.Rows.Add(values); } else { switch (SafeLevel) { case 0: if (values.Length > dt.Columns.Count) { var res = values.ToList(); res.RemoveRange(dt.Columns.Count, values.Length - dt.Columns.Count); dt.Rows.Add(res.ToArray()); } else { dt.Rows.Add(values); } break; case 1: continue; default: throw new Exception("CSV格式错误:表格各行列数不一致"); } } } } } return dt; }
将DataTable类型写入到Csv文件中去
/// <summary> /// 以文件流形式将DataTable写入csv文件 /// </summary> /// <param name="dt"></param> /// <param name="path"></param> /// <param name="hasTitle"></param> /// <returns></returns> public static bool WriteToCsvByDataTable(DataTable dt, string path, bool hasTitle = false) { using (StreamWriter sw = new StreamWriter(path)) { //输出标题行(如果有) if (hasTitle) { for (int i = 0; i < dt.Columns.Count; i++) { sw.Write(dt.Columns[i].ColumnName); if (i != dt.Columns.Count - 1) { sw.Write(","); } } sw.WriteLine(); } //输出文件内容 for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < dt.Columns.Count; j++) { sw.Write(dt.Rows[i][j].ToString()); if (j != dt.Columns.Count - 1) { sw.Write(","); } } sw.WriteLine(); } } return true; }
加载全部内容