类别:程序开发
日期:2020-05-03 浏览:2167 评论:0
.csv操作数据类
public class Common { /// 给定文件的路径,读取文件的二进制数据,判断文件的编码类型 /// <param name="FILE_NAME">文件路径</param> /// <returns>文件的编码类型</returns> public static System.Text.Encoding GetType(string FILE_NAME) { System.IO.FileStream fs = new System.IO.FileStream(FILE_NAME, System.IO.FileMode.Open, System.IO.FileAccess.Read); System.Text.Encoding r = GetType(fs); fs.Close(); return r; } /// 通过给定的文件流,判断文件的编码类型 /// <param name="fs">文件流</param> /// <returns>文件的编码类型</returns> public static System.Text.Encoding GetType(System.IO.FileStream fs) { byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 }; byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 }; byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //带BOM System.Text.Encoding reVal = System.Text.Encoding.Default; System.IO.BinaryReader r = new System.IO.BinaryReader(fs, System.Text.Encoding.Default); int i; int.TryParse(fs.Length.ToString(), out i); byte[] ss = r.ReadBytes(i); if (IsUTF8Bytes(ss) || (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF)) { reVal = System.Text.Encoding.UTF8; } else if (ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00) { reVal = System.Text.Encoding.BigEndianUnicode; } else if (ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41) { reVal = System.Text.Encoding.Unicode; } r.Close(); return reVal; } /// 判断是否是不带 BOM 的 UTF8 格式 /// <param name="data"></param> /// <returns></returns> private static bool IsUTF8Bytes(byte[] data) { int charByteCounter = 1; //计算当前正分析的字符应还有的字节数 byte curByte; //当前分析的字节. for (int i = 0; i < data.Length; i++) { curByte = data[i]; if (charByteCounter == 1) { if (curByte >= 0x80) { //判断当前 while (((curByte <<= 1) & 0x80) != 0) { charByteCounter++; } //标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X if (charByteCounter == 1 || charByteCounter > 6) { return false; } } } else { //若是UTF-8 此时第一位必须为1 if ((curByte & 0xC0) != 0x80) { return false; } charByteCounter--; } } if (charByteCounter > 1) { throw new Exception("非预期的byte格式"); } return true; } /// <summary> /// 从指定url下载csv数据,然后给文件根据下载时间命名,返回文件名 /// </summary> /// <param name="directory">文件夹路径</param> /// <param name="url">下载地址</param> /// <returns>文件名称</returns> public static string DownloadFile(string directory, string url) { try { string fileName = CreateFileName(url); if (!Directory.Exists(directory))//判断指定路径下是否存在指定的文件夹或文件 { Directory.CreateDirectory(directory);//创建路径下的文件夹 } WebClient client = new WebClient(); client.DownloadFile(url, directory + fileName); string datajson=CsvRead(0, directory + fileName);//读取excel表中数据 //另一种方法,将文件地址封装 Dictionary<string, string> dic = new Dictionary<string, string>(); dic.Add("DownExcellocation", directory + fileName); //csvRead(0, dic["DownExcellocation"]); return fileName; } catch { return ""; } } public static string DownloadFile(string url) { string datajson = CsvRead(4, url);//读取excel表中数据 //另一种方法,将文件地址封装 Dictionary<string, string> dic = new Dictionary<string, string>(); dic.Add("DownExcellocation", url); return datajson; } /// <summary> /// 创建文件名称 /// </summary> public static string CreateFileName(string url) { string fileName = ""; string fileExt = url.Substring(url.LastIndexOf(".")).Trim().ToLower(); //Random rnd = new Random(); //fileName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + rnd.Next(10, 99).ToString() + fileExt;//获取随机数 fileName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + System.Guid.NewGuid().ToString().Replace("-", "") + fileExt; return fileName; } /// <summary> /// 将Csv读入DataTable 及返回json数据 /// </summary> /// <param name="filePath">csv文件路径</param> /// <param name="n">表示第n行是字段title,第n+1行是记录开始</param> /// <param name="k">可选参数表示最后K行不算记录默认0</param> public static string CsvRead(int n, string filePath) { DataTable dt = new DataTable(); String csvSplitBy = "(?<=^|,)(\"(?:[^\"]|\"\")*\"|[^,]*)"; StreamReader reader = new StreamReader(filePath, System.Text.Encoding.Default, false); int i = 0, m = 0; reader.Peek(); int r = reader.Peek(); while (reader.Peek()-4 > 0) { m = m + 1; string str = reader.ReadLine(); if (m >= n + 1) { if (m == n + 1) //如果是字段行,则自动加入字段。 { MatchCollection mcs = Regex.Matches(str, csvSplitBy); foreach (Match mc in mcs) { dt.Columns.Add(mc.Value); //增加列标题 } } else { MatchCollection mcs = Regex.Matches(str, "(?<=^|,)(\"(?:[^\"]|\"\")*\"|[^,]*)"); i = 0; System.Data.DataRow dr = dt.NewRow(); foreach (Match mc in mcs) { dr[i] = mc.Value; i++; } dt.Rows.Add(dr); //DataTable 增加一行 } } } // 去掉汇总的后四行数据 for (int t = 1; t <= 4; t++) { dt.Rows.Remove(dt.Rows[dt.Rows.Count - 1]); } string excelJson = DataTableToJson(dt); //Console.WriteLine(excelJson); return excelJson; } /// <summary> /// 将Csv读入DataTable 及返回json数据 /// </summary> /// <param name="filePath">csv文件路径</param> /// <param name="n">表示第n行是字段title,第n+1行是记录开始</param> /// <param name="k">可选参数表示最后K行不算记录默认0</param> public static DataTable CsvReadBydt(int n, string filePath) { DataTable dt = new DataTable(); String csvSplitBy = "(?<=^|,)(\"(?:[^\"]|\"\")*\"|[^,]*)"; StreamReader reader = new StreamReader(filePath, System.Text.Encoding.Default, false); int i = 0, m = 0; reader.Peek(); while (reader.Peek() > 0) { m = m + 1; string str = reader.ReadLine(); if (m >= n + 1) { if (m == n + 1) //如果是字段行,则自动加入字段。 { MatchCollection mcs = Regex.Matches(str, csvSplitBy); foreach (Match mc in mcs) { dt.Columns.Add(mc.Value); //增加列标题 } } else { MatchCollection mcs = Regex.Matches(str, "(?<=^|,)(\"(?:[^\"]|\"\")*\"|[^,]*)"); i = 0; System.Data.DataRow dr = dt.NewRow(); foreach (Match mc in mcs) { dr[i] = mc.Value; i++; } dt.Rows.Add(dr); //DataTable 增加一行 } } } return dt; } #region 帮助类DataSet转换为Json /// <summary> /// DataSet转换为Json /// </summary> /// <param name="dataSet">DataSet对象</param> /// <returns>Json字符串</returns> public static string DataSetToJson(DataSet dataSet) { string jsonString = "{"; foreach (DataTable table in dataSet.Tables) { jsonString += "\"" + table.TableName + "\":" + DataTableToJson(table) + ","; } jsonString = jsonString.TrimEnd(','); return jsonString + "}"; } #endregion #region 帮助类Datatable转换为Json /// <summary> /// Datatable转换为Json /// </summary> /// <param name="table">Datatable对象</param> /// <returns>Json字符串</returns> public static string DataTableToJson(DataTable dt) { StringBuilder jsonString = new StringBuilder(); jsonString.Append("["); DataRowCollection drc = dt.Rows; for (int i = 0; i < drc.Count; i++) { jsonString.Append("{"); for (int j = 0; j < dt.Columns.Count; j++) { string strKey = dt.Columns[j].ColumnName; string strValue = drc[i][j].ToString(); Type type = dt.Columns[j].DataType; jsonString.Append("\"" + strKey + "\":"); strValue = StringFormat(strValue, type); if (j < dt.Columns.Count - 1) { jsonString.Append(strValue + ","); } else { jsonString.Append(strValue); } } jsonString.Append("},"); } jsonString.Remove(jsonString.Length - 1, 1); jsonString.Append("]"); return jsonString.ToString(); } #endregion #region 帮助类格式化字符型、日期型、布尔型StringFormat /// <summary> /// 格式化字符型、日期型、布尔型 /// </summary> /// <param name="str"></param> /// <param name="type"></param> /// <returns></returns> private static string StringFormat(string str, Type type) { if (type == typeof(string)) { str = String2Json(str); str = "\"" + str + "\""; } else if (type == typeof(DateTime)) { str = "\"" + str + "\""; } else if (type == typeof(bool)) { str = str.ToLower(); } else if (type != typeof(string) && string.IsNullOrEmpty(str)) { str = "\"" + str + "\""; } return str; } #endregion #region 过滤特殊字符String2Json(String s) /// <summary> /// 过滤特殊字符 /// </summary> /// <param name="s">字符串</param> /// <returns>json字符串</returns> private static string String2Json(String s) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < s.Length; i++) { char c = s.ToCharArray()[i]; switch (c) { case '\"': sb.Append("\\\""); break; case '\\': sb.Append("\\\\"); break; case '/': sb.Append("\\/"); break; case '\b': sb.Append("\\b"); break; case '\f': sb.Append("\\f"); break; case '\n': sb.Append("\\n"); break; case '\r': sb.Append("\\r"); break; case '\t': sb.Append("\\t"); break; default: sb.Append(c); break; } } return sb.ToString(); } #endregion }
调用方式
string json = Common.DownloadFile(".csv文件路径");
本文标题:C# 如何操作.csv文件?
本文链接:https://vtzw.com/post/176.html
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。
发表评论 / 取消回复