winform CSV檔案的儲存和讀取方式(datatable)
阿新 • • 發佈:2020-07-23
需求:根據某個動作,儲存他的開始時間、動作步驟、完成時間。後續判斷是否有異常。
其實可以增加資料庫欄位,因底層影響,只能通過儲存日誌形式獲取資料。
1.繫結表結構,行列。
(我採用的行資料是根據業務邏輯裡面判斷進行賦值)
/// <summary> /// 繫結DataTable /// </summary> /// <returns>返回DataTable</returns> public DataTable BindDataTable() { DataTable dt= new DataTable(); dt.Columns.Add("DailyStartDate", typeof(DateTime)); dt.Columns.Add("BFStep", typeof(int)); dt.Columns.Add("DailyEndDate", typeof(DateTime)); dt.Rows.Add(DateTime.Now, null, null); return dt; }
DataTable dr = BindDataTable(); dr.Rows[1]["DailyEndDate"] = DateTime.Now; SaveDataTableCSV(dr);
/// <summary> /// 將DataTable中資料寫入到CSV檔案中 /// </summary> /// <param name="dt">提供儲存資料的DataTable</param> /// <param name="fileName">CSV的檔案路徑</param> public void SaveDataTableCSV(DataTable dt) {string fileName = Config.GetFilePath("Log\\NewDailyMaintenance"); FileInfo fi = new FileInfo(fileName); if (!fi.Directory.Exists) { fi.Directory.Create(); } FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write); StreamWriter sw = new StreamWriter(fs, 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(); }
2.讀取csv資料,兩種方式 ①轉換為datatable②儲存字典。
我採用的第二種,方便判斷校驗。
Dictionary<string, string> dic = new Dictionary<string, string>();
/// <summary> /// 將CSV檔案的資料讀取到DataTable中 /// </summary> /// <param name="fileName">CSV檔案路徑</param> /// <returns>列行儲存到字典</returns> public void OpenReadCSV() { string fileName= Config.GetFilePath("Log\\NewDailyMaintenance"); FileInfo fi = new FileInfo(fileName); if (fi.Directory.Exists) { //DataTable dt = new DataTable(); FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); StreamReader sr = new StreamReader(fs, Encoding.Default); //記錄每次讀取的一行記錄 string strLine = ""; //記錄每行記錄中的各欄位內容 string[] aryLine; //標示列數 int columnCount = 0; //標示是否是讀取的第一行 bool IsFirst = true; //逐行讀取CSV中的資料 while ((strLine = sr.ReadLine()) != null) { aryLine = strLine.Split(','); if (IsFirst == true) { IsFirst = false; columnCount = aryLine.Length; ////建立列 //for (int i = 0; i < columnCount; i++) //{ // DataColumn dc = new DataColumn(aryLine[i]); // dt.Columns.Add(dc); //} } else { //DataRow dr = dt.NewRow(); //for (int j = 0; j < columnCount; j++) //{ // dr[j] = aryLine[j]; //} //dt.Rows.Add(dr); for (int j = 0; j < columnCount; j++) { if(columnCount==1) dic.Add("DailyStartDate", aryLine[j]); else if (columnCount ==2) dic.Add("BFStep", aryLine[j]); else if (columnCount == 3) dic.Add("DailyEndDate", aryLine[j]); } } } sr.Close(); fs.Close(); //return dt; } //return null; }