asp.net讀取CSV

原文: asp.net讀取CSV

用Excel導了兩天數據,各類問題,折磨客戶也折磨了本身,之前沒發現的問題一會兒都暴露出來了安全

特地收集兩篇Excel跟CSV讀取相關的兩篇文章奮鬥asp.net

asp.net讀取excel文件,將excel文件先上傳,在讀取,最後刪除。函數

但有一個問題,那就是excel文件夾須要有讀寫的權限,IIS須要爲asp.net用戶開通權限的。ui

並且excel文件自己存在安全隱患,那就是它能夠運行vba程序。因此從安全角度考慮,上傳excel是個很差的方法。編碼

今天介紹另外一種方法,讀取CVS文件。spa

Step1.拖一個fileupload和button控件。.net

Step2.雙擊button,在button事件中寫下列代碼。excel

protected void btnUpload_Click(object sender, EventArgs e)code

    {blog

        if (FileUploadCVS.HasFile)

        {

            if (System.IO.Path.GetExtension(FileUploadCVS.FileName) == ".csv")

            {

                DataTable dt = GetdataFromCVS(FileUploadCVS);

             }

          }

      }

Step3. 寫讀取CVS文件的函數。

public static DataTable GetdataFromCVS(FileUpload fileload)

        {

            DataTable dt = newDataTable();

            StreamReader sr = newStreamReader(fileload.PostedFile .InputStream);

            string strTitle = sr.ReadLine();

            string[] strColumTitle = strTitle.Split(',');   //CVS 文件默認以逗號隔開

            for (int i = 0; i < strColumTitle.Length; i++)

            {

                dt.Columns.Add(strColumTitle[i]);

            }

            while (!sr.EndOfStream)

            {

                string strTest = sr.ReadLine();

                string[] strTestAttribute = strTest.Split(',');

                DataRow dr = dt.NewRow();

                for (int i = 0; i < strColumTitle.Length; i++)

                {

                    dr[strColumTitle[i]] = strTestAttribute[i];

                }

                dt.Rows.Add(dr);

            }

            return dt;

        }

記得加上System.IO 命名空間。StreamReader 是在這個namespace下的。不少跟輸入輸出相關的累都在這個命名空間下


常常用到csv文件,一直用odbc進行讀取,可是在unicode編碼的時候讀取不正確,有時候就算是ANSI編碼,如一列數據混編,讀取也不正確。不清楚是否是我的電腦的問題。只好本身寫個來實現簡單的讀取,解析含","及"""號CSV文件。

更新1:使用中發現有些軟件生存csv文件時,全部數據默認帶有"",之前代碼處理帶引號空字段數據不正確。

    代碼以下,默認用UTF8編碼,一次性讀取整個CSV文件,若誰試用了此段代碼,有問題請反饋給我,謝謝。

複製代碼
        /// <summary>
        /// 讀取csv文件到DataTable
        /// </summary>
        /// <param name="filepath"></param>
        /// <returns></returns>
        static private DataTable ReadCsv(string filepath)
        {
            DataTable dt = new DataTable("NewTable");
            DataRow row;

            string[] lines = File.ReadAllLines(filepath, Encoding.UTF8);
            string[] head = lines[0].Split(',');
            int cnt = head.Length;
            for (int i = 0; i < cnt; i++)
            {
                dt.Columns.Add(head[i]);
            }
            for (int i = 0; i < lines.Length; i++)
            {
                lines[i].Trim();
                if ((string.IsNullOrWhiteSpace(lines[i])))
                {
                    continue;
                }
                try
                {
                    row = dt.NewRow();
                    row.ItemArray = GetRow(lines[i], cnt);
                    dt.Rows.Add(row);
                }
                catch { }
            }
            return dt;
        }
        /// <summary>
        /// 解析字符串 獲取 該行的數據 已經處理,及"號
        /// </summary>
        /// <param name="line">該行的內容</param>
        /// <param name="cnt">總的條目數</param>
        /// <returns></returns>
        static private string[] GetRow(string line, int cnt)
        {
            //line = line.Replace("\"\"", "\""); //若空數據加引號替換不正確
            string[] strs = line.Split(',');
            if (strs.Length == cnt)
            {
                return RemoveQuotes(strs);
            }
            List<string> list = new List<string>();
            int n = 0, begin = 0;
            bool flag = false;

            for (int i = 0; i < strs.Length; i++)
            {

                //沒有引號 或者 中間有引號 直接添加
                if (strs[i].IndexOf("\"") == -1
                    || (flag == false && strs[i][0] != '\"'))
                {
                    list.Add(strs[i]);
                    continue;
                }
                //其實有引號,但該段沒有,號,直接添加
                n = 0;
                foreach (char ch in strs[i])
                {
                    if (ch == '\"')
                    {
                        n++;
                    }
                }
                if (n % 2 == 0)
                {
                    list.Add(strs[i]);
                    continue;
                }
                //該段有引號 有 ,號,下一段增長後添加
                flag = true;
                begin = i;
                i++;
                for (i = begin + 1; i < strs.Length; i++)
                {
                    foreach (char ch in strs[i])
                    {
                        if (ch == '\"')
                        {
                            n++;
                        }
                    }
                    if (strs[i][strs[i].Length - 1] == '\"' && n % 2 == 0)
                    {
                        StringBuilder sb = new StringBuilder();
                        for (; begin <= i; begin++)
                        {
                            sb.Append(strs[begin]);
                            if (begin != i)
                            {
                                sb.Append(",");
                            }
                        }
                        list.Add(sb.ToString());
                        break;
                    }
                }
            }
            return RemoveQuotes(list.ToArray());
        }
        /// <summary>
        /// 將解析的數據 去除多餘的引號
        /// </summary>
        /// <param name="strs"></param>
        /// <returns></returns>
        static string[] RemoveQuotes(string[] strs)
        {
            for (int i = 0; i < strs.Length; i++)
            {
                //若該項數據爲空 但csv文件中加上雙引號
                if (strs[i] == "\"\"")
                {
                    strs[i] = "";
                    continue;
                }
                //若該項數據頭和尾加上引號
                if (strs[i].Length > 2 && strs[i][0] == '\"' && strs[i][strs[i].Length - 1] == '\"')
                {
                    strs[i] = strs[i].Substring(1, strs[i].Length - 2);
                }
                //若該項數據中間有引號
                strs[i] = strs[i].Replace("\"\"", "\"");
            }
            return strs;
        }
複製代碼
相關文章
相關標籤/搜索