亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#讀取csv格式文件的方法

2020-01-24 02:18:18
字體:
來源:轉載
供稿:網友

本文實例講述了C#讀取csv格式文件的方法。分享給大家供大家參考。具體實現方法如下:

一、CSV文件規則
 
1 開頭是不留空,以行為單位。
2 可含或不含列名,含列名則居文件第一行。
3 一行數據不跨行,無空行。
4 以半角逗號(即,)作分隔符,列為空也要表達其存在。
5 列內容如存在半角逗號(即,)則用半角引號(即',')將該字段值包含起來。
6 列內容如存在半角引號(即")則應替換成半角雙引號("")轉義,并用半角引號(即"")將該字段值包含起來。
7 文件讀寫時引號,逗號操作規則互逆。
8 內碼格式不限,可為 ASCII、Unicode 或者其他。
9 不支持特殊字符
 
二、C#讀取csv文件的方法

復制代碼 代碼如下:
//讀CSV文件類,讀取指定的CSV文件,可以導出DataTable
    public class CsvStreamReader
    {
        private ArrayList rowAL;         //行鏈表,CSV文件的每一行就是一個鏈
        private string fileName;        //文件名
        private Encoding encoding;        //編碼
        public CsvStreamReader()
        {
            this.rowAL = new ArrayList();
            this.fileName = "";
            this.encoding = Encoding.Default;
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="fileName">文件名,包括文件路徑</param>
        public CsvStreamReader(string fileName)
        {
            this.rowAL = new ArrayList();
            this.fileName = fileName;
            this.encoding = Encoding.Default;
            LoadCsvFile();
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="fileName">文件名,包括文件路徑</param>
        /// <param name="encoding">文件編碼</param>
        public CsvStreamReader(string fileName, Encoding encoding)
        {
            this.rowAL = new ArrayList();
            this.fileName = fileName;
            this.encoding = encoding;
            LoadCsvFile();
        }
        /// <summary>
        /// 文件名,包括文件路徑
        /// </summary>
        public string FileName
        {
            set
            {
                this.fileName = value;
                LoadCsvFile();
            }
        }
        /// <summary>
        /// 文件編碼
        /// </summary>
        public Encoding FileEncoding
        {
            set
            {
                this.encoding = value;
            }
        }
        /// <summary>
        /// 獲取行數
        /// </summary>
        public int RowCount
        {
            get
            {
                return this.rowAL.Count;
            }
        }
        /// <summary>
        /// 獲取列數
        /// </summary>
        public int ColCount
        {
            get
            {
                int maxCol;
                maxCol = 0;
                for (int i = 0; i < this.rowAL.Count; i++)
                {
                    ArrayList colAL = (ArrayList)this.rowAL[i];
                    maxCol = (maxCol > colAL.Count) ? maxCol : colAL.Count;
                }
                return maxCol;
            }
        }

        /// <summary>
        /// 獲取某行某列的數據
        /// row:行,row = 1代表第一行
        /// col:列,col = 1代表第一列 
        /// </summary>
        public string this[int row, int col]
        {
            get
            {
                //數據有效性驗證
                CheckRowValid(row);
                CheckColValid(col);
                ArrayList colAL = (ArrayList)this.rowAL[row - 1];
                //如果請求列數據大于當前行的列時,返回空值
                if (colAL.Count < col)
                {
                    return "";
                }
                return colAL[col - 1].ToString();
            }
        }

        /// <summary>
        /// 根據最小行,最大行,最小列,最大列,來生成一個DataTable類型的數據
        /// 行等于1代表第一行
        /// 列等于1代表第一列
        /// maxrow: -1代表最大行
        /// maxcol: -1代表最大列
        /// </summary>
        public DataTable this[int minRow, int maxRow, int minCol, int maxCol]
        {
            get
            {
                //數據有效性驗證
                CheckRowValid(minRow);
                CheckMaxRowValid(maxRow);
                CheckColValid(minCol);
                CheckMaxColValid(maxCol);
                if (maxRow == -1)
                {
                    maxRow = RowCount;
                }
                if (maxCol == -1)
                {
                    maxCol = ColCount;
                }
                if (maxRow < minRow)
                {
                    throw new Exception("最大行數不能小于最小行數");
                }
                if (maxCol < minCol)
                {
                    throw new Exception("最大列數不能小于最小列數");
                }
                DataTable csvDT = new DataTable();
                int i;
                int col;
                int row;
                //增加列
                for (i = minCol; i <= maxCol; i++)
                {
                    csvDT.Columns.Add(i.ToString());
                }
                for (row = minRow; row <= maxRow; row++)
                {
                    DataRow csvDR = csvDT.NewRow();
                    i = 0;
                    for (col = minCol; col <= maxCol; col++)
                    {
                        csvDR[i] = this[row, col];
                        i++;
                    }
                    csvDT.Rows.Add(csvDR);
                }
                return csvDT;
            }
        }

        /// <summary>
        /// 檢查行數是否是有效的
        /// </summary>
        /// <param name="col"></param> 
        private void CheckRowValid(int row)
        {
            if (row <= 0)
            {
                throw new Exception("行數不能小于0");
            }
            if (row > RowCount)
            {
                throw new Exception("沒有當前行的數據");
            }
        }
        /// <summary>
        /// 檢查最大行數是否是有效的
        /// </summary>
        /// <param name="col"></param> 
        private void CheckMaxRowValid(int maxRow)
        {
            if (maxRow <= 0 && maxRow != -1)
            {
                throw new Exception("行數不能等于0或小于-1");
            }
            if (maxRow > RowCount)
            {
                throw new Exception("沒有當前行的數據");
            }
        }
        /// <summary>
        /// 檢查列數是否是有效的
        /// </summary>
        /// <param name="col"></param> 
        private void CheckColValid(int col)
        {
            if (col <= 0)
            {
                throw new Exception("列數不能小于0");
            }
            if (col > ColCount)
            {
                throw new Exception("沒有當前列的數據");
            }
        }
        /// <summary>
        /// 檢查檢查最大列數是否是有效的
        /// </summary>
        /// <param name="col"></param> 
        private void CheckMaxColValid(int maxCol)
        {
            if (maxCol <= 0 && maxCol != -1)
            {
                throw new Exception("列數不能等于0或小于-1");
            }
            if (maxCol > ColCount)
            {
                throw new Exception("沒有當前列的數據");
            }
        }
        /// <summary>
        /// 載入CSV文件
        /// </summary>
        private void LoadCsvFile()
        {
            //對數據的有效性進行驗證
            if (this.fileName == null)
            {
                throw new Exception("請指定要載入的CSV文件名");
            }
            else if (!File.Exists(this.fileName))
            {
                throw new Exception("指定的CSV文件不存在");
            }
            else
            {
            }
            if (this.encoding == null)
            {
                this.encoding = Encoding.Default;
            }
            StreamReader sr = new StreamReader(this.fileName, this.encoding);
            string csvDataLine;
            csvDataLine = "";
            while (true)
            {
                string fileDataLine;
                fileDataLine = sr.ReadLine();
                if (fileDataLine == null)
                {
                    break;
                }
                if (csvDataLine == "")
                {
                    csvDataLine = fileDataLine;//GetDeleteQuotaDataLine(fileDataLine);
                }
                else
                {
                    csvDataLine += "http://r//n" + fileDataLine;//GetDeleteQuotaDataLine(fileDataLine);
                }
                //如果包含偶數個引號,說明該行數據中出現回車符或包含逗號
                if (!IfOddQuota(csvDataLine))
                {
                    AddNewDataLine(csvDataLine);
                    csvDataLine = "";
                }
            }
            sr.Close();
            //數據行出現奇數個引號
            if (csvDataLine.Length > 0)
            {
                throw new Exception("CSV文件的格式有錯誤");
            }
        }
        /// <summary>
        /// 獲取兩個連續引號變成單個引號的數據行
        /// </summary>
        /// <param name="fileDataLine">文件數據行</param>
        /// <returns></returns>
        private string GetDeleteQuotaDataLine(string fileDataLine)
        {
            return fileDataLine.Replace("http://"http://"", "http://"");
        }
        /// <summary>
        /// 判斷字符串是否包含奇數個引號
        /// </summary>
        /// <param name="dataLine">數據行</param>
        /// <returns>為奇數時,返回為真;否則返回為假</returns>
        private bool IfOddQuota(string dataLine)
        {
            int quotaCount;
            bool oddQuota;
            quotaCount = 0;
            for (int i = 0; i < dataLine.Length; i++)
            {
                if (dataLine[i] == '//"')
                {
                    quotaCount++;
                }
            }
            oddQuota = false;
            if (quotaCount % 2 == 1)
            {
                oddQuota = true;
            }
            return oddQuota;
        }
        /// <summary>
        /// 判斷是否以奇數個引號開始
        /// </summary>
        /// <param name="dataCell"></param>
        /// <returns></returns>
        private bool IfOddStartQuota(string dataCell)
        {
            int quotaCount;
            bool oddQuota;
            quotaCount = 0;
            for (int i = 0; i < dataCell.Length; i++)
            {
                if (dataCell[i] == '//"')
                {
                    quotaCount++;
                }
                else
                {
                    break;
                }
            }
            oddQuota = false;
            if (quotaCount % 2 == 1)
            {
                oddQuota = true;
            }
            return oddQuota;
        }
        /// <summary>
        /// 判斷是否以奇數個引號結尾
        /// </summary>
        /// <param name="dataCell"></param>
        /// <returns></returns>
        private bool IfOddEndQuota(string dataCell)
        {
            int quotaCount;
            bool oddQuota;
            quotaCount = 0;
            for (int i = dataCell.Length - 1; i >= 0; i--)
            {
                if (dataCell[i] == '//"')
                {
                    quotaCount++;
                }
                else
                {
                    break;
                }
            }
            oddQuota = false;
            if (quotaCount % 2 == 1)
            {
                oddQuota = true;
            }
            return oddQuota;
        }
        /// <summary>
        /// 加入新的數據行
        /// </summary>
        /// <param name="newDataLine">新的數據行</param>
        private void AddNewDataLine(string newDataLine)
        {
            //System.Diagnostics.Debug.WriteLine("NewLine:" + newDataLine);
            ////return;
            ArrayList colAL = new ArrayList();
            string[] dataArray = newDataLine.Split(',');
            bool oddStartQuota;        //是否以奇數個引號開始
            string cellData;
            oddStartQuota = false;
            cellData = "";
            for (int i = 0; i < dataArray.Length; i++)
            {
                if (oddStartQuota)
                {
                    //因為前面用逗號分割,所以要加上逗號
                    cellData += "," + dataArray[i];
                    //是否以奇數個引號結尾
                    if (IfOddEndQuota(dataArray[i]))
                    {
                        colAL.Add(GetHandleData(cellData));
                        oddStartQuota = false;
                        continue;
                    }
                }
                else
                {
                    //是否以奇數個引號開始
                    if (IfOddStartQuota(dataArray[i]))
                    {
                        //是否以奇數個引號結尾,不能是一個雙引號,并且不是奇數個引號
                        if (IfOddEndQuota(dataArray[i]) && dataArray[i].Length > 2 && !IfOddQuota(dataArray[i]))
                        {
                            colAL.Add(GetHandleData(dataArray[i]));
                            oddStartQuota = false;
                            continue;
                        }
                        else
                        {
                            oddStartQuota = true;
                            cellData = dataArray[i];
                            continue;
                        }
                    }
                    else
                    {
                        colAL.Add(GetHandleData(dataArray[i]));
                    }
                }
            }
            if (oddStartQuota)
            {
                throw new Exception("數據格式有問題");
            }
            this.rowAL.Add(colAL);
        }

        /// <summary>
        /// 去掉格子的首尾引號,把雙引號變成單引號
        /// </summary>
        /// <param name="fileCellData"></param>
        /// <returns></returns>
        private string GetHandleData(string fileCellData)
        {
            if (fileCellData == "")
            {
                return "";
            }
            if (IfOddStartQuota(fileCellData))
            {
                if (IfOddEndQuota(fileCellData))
                {
                    return fileCellData.Substring(1, fileCellData.Length - 2).Replace("http://"http://"", "http://""); //去掉首尾引號,然后把雙引號變成單引號
                }
                else
                {
                    throw new Exception("數據引號無法匹配" + fileCellData);
                }
            }
            else
            {
                //考慮形如""    """"      """"""  
                if (fileCellData.Length > 2 && fileCellData[0] == '//"')
                {
                    fileCellData = fileCellData.Substring(1, fileCellData.Length - 2).Replace("http://"http://"", "http://""); //去掉首尾引號,然后把雙引號變成單引號
                }
            }
            return fileCellData;
        }
    }

希望本文所述對大家的C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩国产欧美精品在线| 亚洲人成电影在线播放| 欧美性猛交99久久久久99按摩| 日韩在线欧美在线国产在线| 久久精品视频播放| 精品久久久久久久久久久久久久| 亚洲国产欧美日韩精品| 日韩**中文字幕毛片| 欧美精品在线免费| 国产精品狠色婷| 欧美激情中文网| 91av在线精品| 尤物九九久久国产精品的分类| 亚洲欧美日本精品| 91久久国产精品91久久性色| 久久亚洲精品毛片| 亚洲精品欧美日韩专区| 日韩欧美一区二区三区久久| 热re99久久精品国产66热| 2021久久精品国产99国产精品| 日韩精品日韩在线观看| 欧美在线免费观看| 国产精品欧美在线| 亚洲偷熟乱区亚洲香蕉av| 欧美日韩中文字幕在线视频| 激情亚洲一区二区三区四区| 久久在线免费观看视频| 亚洲精品国产福利| 成人免费激情视频| 精品成人乱色一区二区| 精品无码久久久久久国产| 欧美日本精品在线| 最近免费中文字幕视频2019| 亚洲精品视频二区| 在线视频一区二区| 九九精品在线播放| 国产精品自拍偷拍| 在线不卡国产精品| 久久久在线观看| 国产精品第一区| 国产成人亚洲综合青青| 国产精品久久久久久久久久久久久久| 久久久久久美女| 92裸体在线视频网站| 亚洲高清一二三区| 一区二区三区 在线观看视| 中文字幕日韩av综合精品| 久久久精品电影| 精品美女永久免费视频| 亚洲黄色在线观看| 亚洲精品免费网站| xvideos成人免费中文版| 国产精品福利无圣光在线一区| 在线观看欧美日韩国产| 91在线观看免费高清| 国产91精品最新在线播放| 亚洲欧美激情另类校园| 欧美黄色片免费观看| 91手机视频在线观看| 亚洲国产精品女人久久久| 91高清在线免费观看| 久久久国产一区| 久久夜精品香蕉| 浅井舞香一区二区| 欧美另类暴力丝袜| 日韩在线观看网站| 亚洲精品91美女久久久久久久| 久久久久久综合网天天| 91九色综合久久| 国产一区二区日韩精品欧美精品| 久久久久亚洲精品| 欧美精品一本久久男人的天堂| 97精品视频在线观看| 欧美激情免费在线| 亚洲男人第一av网站| 97碰在线观看| 成人福利视频在线观看| 精品久久久久久中文字幕一区奶水| 97精品久久久| 国产性猛交xxxx免费看久久| 久久久久久久91| 精品国产999| 国产精品国产亚洲伊人久久| 国产精品高潮粉嫩av| 日韩欧美在线免费观看| 亚洲黄色在线看| 日韩欧美国产网站| 精品国产乱码久久久久久虫虫漫画| 欧美激情性做爰免费视频| 91精品国产色综合久久不卡98| 亚洲深夜福利网站| 中文字幕自拍vr一区二区三区| 久久影视电视剧免费网站清宫辞电视| 日韩电影免费观看在线| 成人在线中文字幕| 国产91精品青草社区| 欧美性xxxx18| 欧美丝袜第一区| 国产综合在线视频| 91在线观看欧美日韩| 欧美成人午夜视频| 色偷偷9999www| 日本91av在线播放| 亚洲午夜激情免费视频| 国色天香2019中文字幕在线观看| 最近2019中文字幕一页二页| 精品色蜜蜜精品视频在线观看| 久久精品国产91精品亚洲| 91视频免费网站| 另类色图亚洲色图| 7m第一福利500精品视频| 色悠悠久久久久| 美女黄色丝袜一区| 欧美最猛性xxxxx亚洲精品| 欧美日韩国产精品| 欧美激情二区三区| 欧美自拍视频在线观看| 亚洲精品动漫100p| 亚洲欧美日韩爽爽影院| 欧美激情一区二区三区成人| 国产成人综合精品在线| 亚洲午夜精品视频| 国产成人高潮免费观看精品| 色综合男人天堂| 欧美成人免费视频| 91亚洲人电影| 久久影院在线观看| 国产视频自拍一区| 亚洲精品动漫100p| 97国产精品视频人人做人人爱| 欧美高清videos高潮hd| 久久精品中文字幕一区| 伊人伊成久久人综合网小说| 中文字幕v亚洲ⅴv天堂| 亚洲福利视频免费观看| 国产mv免费观看入口亚洲| 精品国内产的精品视频在线观看| 热久久这里只有精品| 欧美黑人一级爽快片淫片高清| 国产亚洲精品高潮| 91亚洲国产精品| 国产欧美日韩视频| 自拍偷拍亚洲区| 欧美激情一区二区三区久久久| 欧美国产亚洲精品久久久8v| 欧美成人精品不卡视频在线观看| 日韩中文在线中文网在线观看| 国产精品1234| 日韩成人久久久| 68精品国产免费久久久久久婷婷| 欧美猛少妇色xxxxx| 亚洲女人天堂成人av在线| 日韩精品福利在线| 亚洲欧美一区二区三区情侣bbw| 疯狂欧美牲乱大交777| 欧美电影免费观看电视剧大全| 国产狼人综合免费视频| 2019国产精品自在线拍国产不卡| 亚洲第一精品夜夜躁人人爽| 亚洲电影免费在线观看| 欧美性猛交xxx| 98精品国产高清在线xxxx天堂| 国产97色在线| 亚洲三级黄色在线观看|