2014年6月17日 星期二

把DataSet轉CSV的winform小程式

逗號分隔值(Comma-Separated Values,CSV,有時也稱為字元分隔值,因為分隔字元也可以不是逗號),其文件以純文本形式存儲表格數據(數字和文本)
已上擷取自維基百科 逗號分隔值

dataset轉CSV大至上很不難,但我一直沒能在GOOGLE上直接找到預期功能的元件或工具,剛好前幾天有需求,就順手做了一個winform小程式

用逗號分隔,可以自行決定是否輸入第一行的值(並沒有檢查第一行值的數量是否等於dataset每行的資料數量)

所有資料都用雙引號(\")包起來,同時資料內的雙引號改為雙雙引號(\"=>\"\"),另外有特別處理一下斷行符(\r\n),把他替換成空白;輸出的CSV檔名預設為系統時間的時+分+秒。

裡面並沒有針對資料格式做判斷,比如說有沒有哪一行資料數量跟其他行不一樣;或是第一行的資料格式有沒有異常、資料是否包含可能會發生錯誤的字元等等,只是做為一個產出CSV的小工具而已。不過一如往常會有原始檔,可以改成自己要用的格式或加上檢查。

使用 .net framework 2.0

我的雲端硬碟

裡面的 DataSetToCSV_R.rar

//選擇存檔路徑
        private void btnSavePath_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog path = new FolderBrowserDialog();
            path.ShowDialog();
            tbxSavePath.Text = path.SelectedPath;
        }

        private void btnMake_Click(object sender, EventArgs e)
        {
            strDBComm = "Server = " + tbxServer.Text.Trim() + "; database = " + tbxDataBase.Text.Trim() + "; uid=" + tbxUID.Text.Trim() + "; pwd=" + tbxPassword.Text.Trim() + "; Max Pool Size = 500; timeout = 180000";            
            tData = SelectSQLCommon_DT(tbxQuery.Text.Replace("\r\n", ""));
            strCSVSavePath = tbxSavePath.Text.Trim() + "\\" + DateTime.Now.Hour + DateTime.Now.Minute + DateTime.Now.Second + ".csv";
            StreamWriter sw = new StreamWriter(strCSVSavePath, false, Encoding.Default);
            if (rbtFirstLineTrue.Checked)
            {
                sw.Write("\"");
                sw.Write(tbxFirstLine.Text.Trim().Replace(",", "\",\""));
                sw.Write("\"");                
            }
            sw.Write(sw.NewLine);
            foreach (DataRow dr in tData.Rows)
            {
                if (tData.Columns.Count > 0 && !Convert.IsDBNull(dr[0]))
                    sw.Write("\"" + ReplaceSign(Convert.ToString(dr[0])).Trim());
                for (int i = 1; i < tData.Columns.Count; i++)
                {
                    sw.Write("\",\"" + ReplaceSign(Convert.ToString(dr[i])).Trim());
                }
                sw.Write("\"");
                sw.Write(sw.NewLine);
            }
            sw.Close();
        }

        //讀取資料-回傳DataTable
        public DataTable SelectSQLCommon_DT(string _strSQL)
        {
            DataTable _dtData = new DataTable();

            SqlConnection _myConnection = new SqlConnection(strDBComm);
            if (_myConnection.State == ConnectionState.Closed) _myConnection.Open();
            SqlDataAdapter _daCommon = new SqlDataAdapter(_strSQL, _myConnection);
            _daCommon.SelectCommand.CommandTimeout = 3600;
            _daCommon.Fill(_dtData);

            _daCommon.Dispose();
            _myConnection.Close();
            _myConnection.Dispose();
            return _dtData;
        }

        //替換掉\r\n 與加上雙引號
        public string ReplaceSign(string OldString)
        {
            return OldString.Replace("\r\n", " ").Replace("\"", "\"\"");
        }

        private void rbtFirstLineTrue_CheckedChanged(object sender, EventArgs e)
        {
            lblFirstLine.Visible = true;
            tbxFirstLine.Visible = true;
        }

        private void rbtFirstLineFalse_CheckedChanged(object sender, EventArgs e)
        {
            lblFirstLine.Visible = false;
            tbxFirstLine.Visible = false;
        }