using System; using System.Data; using System.IO; using System.Collections.Generic; using System.ComponentModel; using System.Reflection; namespace Sog { public static class CsvHelper { /// /// 写入CSV文件 /// /// DataTable /// 文件全名 /// 是否写入成功 public static bool SaveCSV(DataTable dt, string fullFileName) { var r = false; FileStream fs = new FileStream(fullFileName, System.IO.FileMode.Create, System.IO.FileAccess.Write); StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.Default); 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++) { data += dt.Rows[i][j].ToString(); if (j < dt.Columns.Count - 1) { data += ","; } } sw.WriteLine(data); } sw.Close(); fs.Close(); r = true; return r; } public static List GetByFullPath(string fullFileName) where T : class, new() { DataTable dt = OpenCSV(fullFileName); return TableToEntity(dt); } /// /// 打开CSV 文件 /// /// 文件全名 /// DataTable public static DataTable OpenCSV(string fullFileName) { return OpenCSV(fullFileName, 0, 0, 0, 0, true); } /// /// 打开CSV 文件 /// /// 文件全名 /// 开始行 /// 开始列 /// 获取多少行 /// 获取多少列 /// 是有标题行 /// DataTable public static DataTable OpenCSV(string fullFileName, Int16 firstRow = 0, Int16 firstColumn = 0, Int16 getRows = 0, Int16 getColumns = 0, bool haveTitleRow = true) { DataTable dt = new DataTable(); FileStream fs = new FileStream(fullFileName, System.IO.FileMode.Open, System.IO.FileAccess.Read); StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default); //记录每次读取的一行记录 string strLine = ""; //记录每行记录中的各字段内容 string[] aryLine; //标示列数 int columnCount = 0; //是否已建立了表的字段 bool bCreateTableColumns = false; //第几行 int iRow = 1; //去除无用行 if (firstRow > 0) { for (int i = 1; i < firstRow; i++) { sr.ReadLine(); } } // { ",", ".", "!", "?", ";", ":", " " }; string[] separators = { "," }; //逐行读取CSV中的数据 while ((strLine = sr.ReadLine()) != null) { strLine = strLine.Trim(); aryLine = strLine.Split(separators, System.StringSplitOptions.RemoveEmptyEntries); if (bCreateTableColumns == false) { bCreateTableColumns = true; columnCount = aryLine.Length; //创建列 for (int i = firstColumn; i < (getColumns == 0 ? columnCount : firstColumn + getColumns); i++) { DataColumn dc = new DataColumn(haveTitleRow == true ? aryLine[i] : "COL" + i.ToString()); dt.Columns.Add(dc); } bCreateTableColumns = true; if (haveTitleRow == true) { continue; } } DataRow dr = dt.NewRow(); for (int j = firstColumn; j < (getColumns == 0 ? columnCount : firstColumn + getColumns); j++) { dr[j - firstColumn] = aryLine[j]; } dt.Rows.Add(dr); iRow = iRow + 1; if (getRows > 0) { if (iRow > getRows) { break; } } } sr.Close(); fs.Close(); return dt; } /// /// DataTable转换成实体类 /// /// /// /// public static List TableToEntity(DataTable dt) where T : class, new() { List list = new List(); try { foreach (DataRow row in dt.Rows) { T entity = new T(); PropertyInfo[] pArray = entity.GetType().GetProperties(); foreach (PropertyInfo p in pArray) { if (dt.Columns.Contains(p.Name)) { if (!p.CanWrite) continue; var value = row[p.Name]; if (value != DBNull.Value) { Type targetType = p.PropertyType; Type convertType = targetType; if (targetType.IsGenericType && targetType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) { //可空类型 NullableConverter nullableConverter = new NullableConverter(targetType); convertType = nullableConverter.UnderlyingType; } if (!string.IsNullOrEmpty(convertType.FullName) && !string.IsNullOrEmpty(value.ToString())) { value = Convert.ChangeType(value, convertType); } switch (convertType.FullName) { case "System.Decimal": p.SetValue(entity, Convert.ToDecimal(value), null); break; case "System.String": p.SetValue(entity, Convert.ToString(value), null); break; case "System.Int32": p.SetValue(entity, Convert.ToInt32(value), null); break; case "System.Int64": p.SetValue(entity, Convert.ToInt64(value), null); break; case "System.Int16": p.SetValue(entity, Convert.ToInt16(value), null); break; case "System.Double": p.SetValue(entity, Convert.ToDouble(value), null); break; case "System.DateTime": p.SetValue(entity, Convert.ToDateTime(value), null); break; default: p.SetValue(entity, value, null); break; } } } } list.Add(entity); } } catch (Exception ex) { Console.WriteLine(ex.Message); } if (list.Count > 0) return list; else return null; } } }