1. 程式人生 > 實用技巧 >winform CSV檔案的儲存和讀取方式(datatable)

winform CSV檔案的儲存和讀取方式(datatable)

需求:根據某個動作,儲存他的開始時間、動作步驟、完成時間。後續判斷是否有異常。

其實可以增加資料庫欄位,因底層影響,只能通過儲存日誌形式獲取資料。

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;
        }