已上擷取自維基百科 逗號分隔值
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;
}