C#操作CSV存取類


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Windows.Forms;
using System.IO;
namespace FileReadAndWrite
{
     <summary>
     操作CSV存取類
     </summary>
    public class OutForCVS
    {
        #region 變量
         <summary>
         取出配置文件中的分隔符
         </summary>
        private static string _splitChar = null;
         <summary>
         取出配置文件中的編碼方式
         </summary>
        private static string _encodeFormat = null;
        #endregion
        #region 構造方法
         <summary>
         構造方法獲取分隔符、編碼方式
         </summary>
       
        #endregion
        #region 寫CSV方法
         <summary>
         寫入CSV
         </summary>
         <param name="hasHeader">列頭</param>
         <param name="dtOutputCSV">文件內容</param>
        public void WriteCSV(bool hasHeader, DataTable dtOutputCSV)
        {
             Log開始
            INGLog.WriteLog(INGLogLevel.Debug, INGConstants.START);
             獲取寫入文件名稱以及格式
            String strFileName = DateTime.Now.ToString("YYYYMMDDhhmm");
            SaveFileDialog savFileDialog = new SaveFileDialog();
            savFileDialog.Reset();
            savFileDialog.DefaultExt = "csv";
            savFileDialog.Filter = "CSV|*.csv";
            savFileDialog.ShowDialog();
            strFileName = savFileDialog.FileName;
             判斷文件名
            if (string.IsNullOrEmpty(strFileName))
            {
                 信息提示
                INGMessage.ShowMessage("M009", "WriteFileName");
            }
             重載方法調用,寫入文件
            WriteCSV(hasHeader, dtOutputCSV, strFileName+".csv");
             Log結束
            INGLog.WriteLog(INGLogLevel.Debug, INGConstants.END);
        }
        #endregion
        #region 寫入CSV,附帶路徑方法
         <summary>
         寫入CSV,附帶路徑
         </summary>
         <param name="hasHeader">列頭</param>
         <param name="dtOutputCSV">文件內容</param>
         <param name="strPath">指定文件路徑</param>
        public static void WriteCSV(bool hasHeader, DataTable dtOutputCSV, string strPath)
        {
             Log開始
            INGLog.WriteLog(INGLogLevel.Debug, INGConstants.START);
             DataTable有無判斷
            if (dtOutputCSV == null)
            {
                throw new ArgumentNullException("Argument(dtOutputCSV) is null!");
            }
             StringBuilder初始化
            StringBuilder sb = new StringBuilder();
             DataTable有無數據判斷
            if (hasHeader)
            {
                添加列頭
                foreach (DataColumn dc in dtOutputCSV.Columns)
                {
                    if (dc.DataType == Type.GetType("System.String"))
                    {
                        dc.ColumnName = "'" + dc.ColumnName + "'"; //修改
                    }
                    sb.Append(dc.ColumnName).Append(_splitChar);
                }
                 創建新行
                sb.Remove(sb.Length - 1, 1);
                sb.Append(Environment.NewLine);
            }
             路徑為空或者取消保存時
            if (strPath == "")
            {
                return;
            }
             添加行
            foreach (DataRow dr in dtOutputCSV.Rows)
            {
                foreach (object rowItem in dr.ItemArray)//object rowItem
                {
                    object itemValue = rowItem;
                    itemValue = "'" + itemValue + "'";
                    sb.Append(itemValue).Append(_splitChar);
                }
                 創建新行
                sb.Remove(sb.Length - 1, 1);
                sb.Append(Environment.NewLine);
            }
            using (TextWriter tw = new StreamWriter(strPath, false))
            {
                tw.Write(sb.ToString());
                INGMessage.ShowMessage("M010", "Success");
                tw.Flush();
                tw.Close();
            }
             Log結束
            INGLog.WriteLog(INGLogLevel.Debug, INGConstants.END);
        }
        #endregion
        #region 讀CSV文件方法
        /// <summary>
        /// 讀CSV文件
        /// </summary>
        /// <param name="hasHeader">列頭</param>
        /// <returns>返回信息</returns>
        public static DataTable ReadCSV(bool hasHeader)
        {
            // Log開始
            //INGLog.WriteLog(INGLogLevel.Debug, INGConstants.START);
            String strFileName;
            using (OpenFileDialog ofdFileDialog = new OpenFileDialog())
            {
                ofdFileDialog.Reset();
                ofdFileDialog.DefaultExt = "csv";
                ofdFileDialog.Filter = "CSV|*.csv";
                ofdFileDialog.ShowDialog();
                // 文件名取得
                strFileName = ofdFileDialog.FileName;
            }
            // 文件路徑取得
            String strFilePath = Path.GetFileName(strFileName);
            // 文件路徑判斷
            if (string.IsNullOrEmpty(strFilePath))
            {
                return null;
            }
            // Log結束
            //INGLog.WriteLog(INGLogLevel.Debug, INGConstants.END);
            return ReadCSV(hasHeader, strFilePath);
        }
        #endregion
        #region 讀指定路徑CSV文件方法
         <summary>
         讀指定路徑CSV文件
         </summary>
         <param name="hasHeader">列頭</param>
         <param name="strPath">指定文件路徑</param>
         <returns>返回信息</returns>
        public static DataTable ReadCSV(bool hasHeader, string strPath)
        {
            // Log開始
            //INGLog.WriteLog(INGLogLevel.Debug, INGConstants.START);
            String FileName = Path.GetFileName(strPath);
            // 文件路徑判斷
            if (string.IsNullOrEmpty(FileName))
            {
                return null;
            }
            DataTable dt = new DataTable(FileName);
            // 文本文件分析instance生成
            TextFieldParser parser = new TextFieldParser(strPath, Encoding.GetEncoding(_encodeFormat));
            // 指定文件形式
            parser.TextFieldType = FieldType.Delimited;
            // 段落分割
            parser.SetDelimiters(_splitChar);
            // 設置CSV行計數
            int iRowCnt = 0;
            // 到文件最后邊界   
            while (!parser.EndOfData)
            {
                // 讀入一行
                string[] row = parser.ReadFields();
                // CSV行判斷
                if (iRowCnt.Equals(0))
                {
                    // 判斷列頭有無
                    if (hasHeader)
                    {
                        int i = 0;
                        // 添加列到行
                        foreach (string sColumn in row)
                        {
                            // DataColumn初始化
                            DataColumn column = new DataColumn();
                            column.DataType = Type.GetType("System.String");
                            string sColumnValue = sColumn;
                            sColumnValue = sColumnValue.Substring(1, sColumnValue.Length - 2);
                            column.ColumnName = sColumnValue;
                            dt.Columns.Add(column);
                        }
                    }
                }
                // 數據
                else //修改
                {
                    // 行添加
                    int rowLength = row.Length;
                    DataRow dr = dt.NewRow();
                    for (int j = 0; j < rowLength; j++)
                    {
                        string columnValue = row.GetValue(j).ToString();
                        columnValue = columnValue.Substring(1, columnValue.Length - 2);
                        dr[j] = columnValue;
                    }
                    dt.Rows.Add(dr);
                }
                // CSV行計數
                iRowCnt++;
            }
            // Log結束
            INGLog.WriteLog(INGLogLevel.Debug, INGConstants.END);
            return dt;
        }
        #endregion
        public void CreateCsv(System.Data.DataTable dt, string strName)
        {
 
            先打印標頭
            StringBuilder strColu = new StringBuilder();
            StringBuilder strValue = new StringBuilder();
            int i = 0;
            try
            {
                StreamWriter sw = new StreamWriter(new FileStream(strName + ".csv", FileMode.Create), Encoding.GetEncoding("GB2312"));
                for (i = 0; i <= dt.Columns.Count - 1; i++)
                {
                    strColu.Append("\"" + dt.Columns[i].ColumnName + "\"");
                    strColu.Append(",");
                }
                strColu.Remove(strColu.Length - 1, 1);//移出掉最后一個,字符
                sw.WriteLine(strColu);
                foreach (DataRow dr in dt.Rows)
                {
                    strValue.Remove(0, strValue.Length);//移出
                    for (i = 0; i <= dt.Columns.Count - 1; i++)
                    {
                        strValue.Append("\"" + dr[i].ToString().Replace("'", "''").Replace(",", "") + "\"");
                        strValue.Append(",");
                    }
                    strValue.Remove(strValue.Length - 1, 1);//移出掉最后一個,字符
                    sw.WriteLine(strValue);
                }
                sw.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

    }
}

 

之前所寫,遷移至此

原文鏈接:http://user.qzone.qq.com/372806800/blog/1345305065


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM