C#读取csv格式文件

2020-12-13 14:22

阅读:546

标签:style   http   io   os   ar   for   sp   strong   文件   

一、CSV文件规则

 

1 开头是不留空,以行为单位。
2 可含或不含列名,含列名则居文件第一行。
3 一行数据不跨行,无空行。
4 以半角逗号(即,)作分隔符,列为空也要表达其存在。
5 列内容如存在半角逗号(即,)则用半角引号(即‘,‘)将该字段值包含起来。
6 列内容如存在半角引号(即")则应替换成半角双引号("")转义,并用半角引号(即"")将该字段值包含起来。
7 文件读写时引号,逗号操作规则互逆。
8 内码格式不限,可为 ASCII、Unicode 或者其他。
9 不支持特殊字符
 
 
 
二、C#读取csv文件的方法
 
 
C# 代码   复制
soscw.com,搜素材soscw.com,搜素材soscw.com,搜素材
//读CSV文件类,读取指定的CSV文件,可以导出DataTable
soscw.com,搜素材
    public class CsvStreamReader
soscw.com,搜素材
    {
soscw.com,搜素材        private ArrayList rowAL;         //行链表,CSV文件的每一行就是一个链
soscw.com,搜素材        private string fileName;        //文件名
soscw.com,搜素材soscw.com,搜素材        private Encoding encoding;        //编码
soscw.com,搜素材soscw.com,搜素材        public CsvStreamReader()
soscw.com,搜素材{
soscw.com,搜素材            this.rowAL = new ArrayList();
soscw.com,搜素材            this.fileName = "";
soscw.com,搜素材            this.encoding = Encoding.Default;
soscw.com,搜素材        }
soscw.com,搜素材soscw.com,搜素材/// soscw.com,搜素材        ///
soscw.com,搜素材        /// soscw.com,搜素材        /// 文件名,包括文件路径
soscw.com,搜素材        public CsvStreamReader(string fileName)
soscw.com,搜素材{
soscw.com,搜素材            this.rowAL = new ArrayList();
soscw.com,搜素材            this.fileName = fileName;
soscw.com,搜素材            this.encoding = Encoding.Default;
soscw.com,搜素材            LoadCsvFile();
soscw.com,搜素材        }
soscw.com,搜素材soscw.com,搜素材/// soscw.com,搜素材        ///
soscw.com,搜素材        /// soscw.com,搜素材        /// 文件名,包括文件路径
soscw.com,搜素材        /// 文件编码
soscw.com,搜素材        public CsvStreamReader(string fileName, Encoding encoding)
soscw.com,搜素材{
soscw.com,搜素材            this.rowAL = new ArrayList();
soscw.com,搜素材            this.fileName = fileName;
soscw.com,搜素材            this.encoding = encoding;
soscw.com,搜素材            LoadCsvFile();
soscw.com,搜素材        }
soscw.com,搜素材soscw.com,搜素材/// soscw.com,搜素材        /// 文件名,包括文件路径
soscw.com,搜素材        /// soscw.com,搜素材        public string FileName
soscw.com,搜素材{
soscw.com,搜素材            set
soscw.com,搜素材{
soscw.com,搜素材                this.fileName = value;
soscw.com,搜素材                LoadCsvFile();
soscw.com,搜素材            }
soscw.com,搜素材        }
soscw.com,搜素材soscw.com,搜素材/// soscw.com,搜素材        /// 文件编码
soscw.com,搜素材        /// soscw.com,搜素材soscw.com,搜素材        public Encoding FileEncoding
soscw.com,搜素材{
soscw.com,搜素材            set
soscw.com,搜素材{
soscw.com,搜素材                this.encoding = value;
soscw.com,搜素材            }
soscw.com,搜素材        }
soscw.com,搜素材soscw.com,搜素材/// soscw.com,搜素材        /// 获取行数
soscw.com,搜素材        /// soscw.com,搜素材        public int RowCount
soscw.com,搜素材{
soscw.com,搜素材            get
soscw.com,搜素材{
soscw.com,搜素材                return this.rowAL.Count;
soscw.com,搜素材            }
soscw.com,搜素材        }
soscw.com,搜素材soscw.com,搜素材/// soscw.com,搜素材        /// 获取列数
soscw.com,搜素材        /// soscw.com,搜素材        public int ColCount
soscw.com,搜素材{
soscw.com,搜素材            get
soscw.com,搜素材{
soscw.com,搜素材                int maxCol;
soscw.com,搜素材soscw.com,搜素材                maxCol = 0;
soscw.com,搜素材                for (int i = 0; i {
soscw.com,搜素材                    ArrayList colAL = (ArrayList)this.rowAL[i];
soscw.com,搜素材soscw.com,搜素材                    maxCol = (maxCol > colAL.Count) ? maxCol : colAL.Count;
soscw.com,搜素材                }
soscw.com,搜素材soscw.com,搜素材                return maxCol;
soscw.com,搜素材            }
soscw.com,搜素材        }
soscw.com,搜素材soscw.com,搜素材soscw.com,搜素材/// soscw.com,搜素材        /// 获取某行某列的数据
soscw.com,搜素材soscw.com,搜素材        /// row:行,row = 1代表第一行
soscw.com,搜素材soscw.com,搜素材        /// col:列,col = 1代表第一列  
soscw.com,搜素材        /// soscw.com,搜素材        public string this[int row, int col]
soscw.com,搜素材{
soscw.com,搜素材            get
soscw.com,搜素材{
soscw.com,搜素材                //数据有效性验证
soscw.com,搜素材soscw.com,搜素材                CheckRowValid(row);
soscw.com,搜素材                CheckColValid(col);
soscw.com,搜素材                ArrayList colAL = (ArrayList)this.rowAL[row - 1];
soscw.com,搜素材soscw.com,搜素材                //如果请求列数据大于当前行的列时,返回空值
soscw.com,搜素材soscw.com,搜素材                if (colAL.Count {
soscw.com,搜素材                    return "";
soscw.com,搜素材                }
soscw.com,搜素材soscw.com,搜素材                return colAL[col - 1].ToString();
soscw.com,搜素材            }
soscw.com,搜素材        }
soscw.com,搜素材soscw.com,搜素材soscw.com,搜素材/// soscw.com,搜素材        /// 根据最小行,最大行,最小列,最大列,来生成一个DataTable类型的数据
soscw.com,搜素材soscw.com,搜素材        /// 行等于1代表第一行
soscw.com,搜素材soscw.com,搜素材        /// 列等于1代表第一列
soscw.com,搜素材soscw.com,搜素材        /// maxrow: -1代表最大行
soscw.com,搜素材        /// maxcol: -1代表最大列
soscw.com,搜素材        /// soscw.com,搜素材        public DataTable this[int minRow, int maxRow, int minCol, int maxCol]
soscw.com,搜素材{
soscw.com,搜素材            get
soscw.com,搜素材{
soscw.com,搜素材                //数据有效性验证
soscw.com,搜素材soscw.com,搜素材                CheckRowValid(minRow);
soscw.com,搜素材                CheckMaxRowValid(maxRow);
soscw.com,搜素材                CheckColValid(minCol);
soscw.com,搜素材                CheckMaxColValid(maxCol);
soscw.com,搜素材                if (maxRow == -1)
soscw.com,搜素材{
soscw.com,搜素材                    maxRow = RowCount;
soscw.com,搜素材                }
soscw.com,搜素材                if (maxCol == -1)
soscw.com,搜素材{
soscw.com,搜素材                    maxCol = ColCount;
soscw.com,搜素材                }
soscw.com,搜素材                if (maxRow {
soscw.com,搜素材                    throw new Exception("最大行数不能小于最小行数");
soscw.com,搜素材                }
soscw.com,搜素材                if (maxCol {
soscw.com,搜素材                    throw new Exception("最大列数不能小于最小列数");
soscw.com,搜素材                }
soscw.com,搜素材                DataTable csvDT = new DataTable();
soscw.com,搜素材                int i;
soscw.com,搜素材                int col;
soscw.com,搜素材                int row;
soscw.com,搜素材soscw.com,搜素材                //增加列
soscw.com,搜素材soscw.com,搜素材                for (i = minCol; i {
soscw.com,搜素材                    csvDT.Columns.Add(i.ToString());
soscw.com,搜素材                }
soscw.com,搜素材                for (row = minRow; row {
soscw.com,搜素材                    DataRow csvDR = csvDT.NewRow();
soscw.com,搜素材soscw.com,搜素材                    i = 0;
soscw.com,搜素材                    for (col = minCol; col {
soscw.com,搜素材                        csvDR[i] = this[row, col];
soscw.com,搜素材                        i++;
soscw.com,搜素材                    }
soscw.com,搜素材                    csvDT.Rows.Add(csvDR);
soscw.com,搜素材                }
soscw.com,搜素材soscw.com,搜素材                return csvDT;
soscw.com,搜素材            }
soscw.com,搜素材        }
soscw.com,搜素材soscw.com,搜素材soscw.com,搜素材/// soscw.com,搜素材        /// 检查行数是否是有效的
soscw.com,搜素材soscw.com,搜素材        /// soscw.com,搜素材        /// 
soscw.com,搜素材        private void CheckRowValid(int row)
soscw.com,搜素材{
soscw.com,搜素材            if (row {
soscw.com,搜素材                throw new Exception("行数不能小于0");
soscw.com,搜素材            }
soscw.com,搜素材            if (row > RowCount)
soscw.com,搜素材{
soscw.com,搜素材                throw new Exception("没有当前行的数据");
soscw.com,搜素材            }
soscw.com,搜素材        }
soscw.com,搜素材soscw.com,搜素材/// soscw.com,搜素材        /// 检查最大行数是否是有效的
soscw.com,搜素材soscw.com,搜素材        /// soscw.com,搜素材        /// 
soscw.com,搜素材        private void CheckMaxRowValid(int maxRow)
soscw.com,搜素材{
soscw.com,搜素材            if (maxRow {
soscw.com,搜素材                throw new Exception("行数不能等于0或小于-1");
soscw.com,搜素材            }
soscw.com,搜素材            if (maxRow > RowCount)
soscw.com,搜素材{
soscw.com,搜素材                throw new Exception("没有当前行的数据");
soscw.com,搜素材            }
soscw.com,搜素材        }
soscw.com,搜素材soscw.com,搜素材/// soscw.com,搜素材        /// 检查列数是否是有效的
soscw.com,搜素材soscw.com,搜素材        /// soscw.com,搜素材        /// 
soscw.com,搜素材        private void CheckColValid(int col)
soscw.com,搜素材{
soscw.com,搜素材            if (col {
soscw.com,搜素材                throw new Exception("列数不能小于0");
soscw.com,搜素材            }
soscw.com,搜素材            if (col > ColCount)
soscw.com,搜素材{
soscw.com,搜素材                throw new Exception("没有当前列的数据");
soscw.com,搜素材            }
soscw.com,搜素材        }
soscw.com,搜素材soscw.com,搜素材/// soscw.com,搜素材        /// 检查检查最大列数是否是有效的
soscw.com,搜素材soscw.com,搜素材        /// soscw.com,搜素材        /// 
soscw.com,搜素材        private void CheckMaxColValid(int maxCol)
soscw.com,搜素材{
soscw.com,搜素材            if (maxCol {
soscw.com,搜素材                throw new Exception("列数不能等于0或小于-1");
soscw.com,搜素材            }
soscw.com,搜素材            if (maxCol > ColCount)
soscw.com,搜素材{
soscw.com,搜素材                throw new Exception("没有当前列的数据");
soscw.com,搜素材            }
soscw.com,搜素材        }
soscw.com,搜素材soscw.com,搜素材/// soscw.com,搜素材        /// 载入CSV文件
soscw.com,搜素材        /// soscw.com,搜素材        private void LoadCsvFile()
soscw.com,搜素材{
soscw.com,搜素材            //对数据的有效性进行验证
soscw.com,搜素材soscw.com,搜素材            if (this.fileName == null)
soscw.com,搜素材{
soscw.com,搜素材                throw new Exception("请指定要载入的CSV文件名");
soscw.com,搜素材            }
soscw.com,搜素材            else if (!File.Exists(this.fileName))
soscw.com,搜素材{
soscw.com,搜素材                throw new Exception("指定的CSV文件不存在");
soscw.com,搜素材            }
soscw.com,搜素材            else
soscw.com,搜素材{
soscw.com,搜素材            }
soscw.com,搜素材            if (this.encoding == null)
soscw.com,搜素材{
soscw.com,搜素材                this.encoding = Encoding.Default;
soscw.com,搜素材            }
soscw.com,搜素材soscw.com,搜素材            StreamReader sr = new StreamReader(this.fileName, this.encoding);
soscw.com,搜素材            string csvDataLine;
soscw.com,搜素材soscw.com,搜素材            csvDataLine = "";
soscw.com,搜素材            while (true)
soscw.com,搜素材{
soscw.com,搜素材                string fileDataLine;
soscw.com,搜素材soscw.com,搜素材                fileDataLine = sr.ReadLine();
soscw.com,搜素材                if (fileDataLine == null)
soscw.com,搜素材{
soscw.com,搜素材                    break;
soscw.com,搜素材                }
soscw.com,搜素材                if (csvDataLine == "")
soscw.com,搜素材{
soscw.com,搜素材                    csvDataLine = fileDataLine;//GetDeleteQuotaDataLine(fileDataLine);
soscw.com,搜素材                }
soscw.com,搜素材                else
soscw.com,搜素材{
soscw.com,搜素材                    csvDataLine += "\\r\\n" + fileDataLine;//GetDeleteQuotaDataLine(fileDataLine);
soscw.com,搜素材                }
soscw.com,搜素材                //如果包含偶数个引号,说明该行数据中出现回车符或包含逗号
soscw.com,搜素材                if (!IfOddQuota(csvDataLine))
soscw.com,搜素材{
soscw.com,搜素材                    AddNewDataLine(csvDataLine);
soscw.com,搜素材                    csvDataLine = "";
soscw.com,搜素材                }
soscw.com,搜素材            }
soscw.com,搜素材            sr.Close();
soscw.com,搜素材            //数据行出现奇数个引号
soscw.com,搜素材            if (csvDataLine.Length > 0)
soscw.com,搜素材{
soscw.com,搜素材                throw new Exception("CSV文件的格式有错误");
soscw.com,搜素材            }
soscw.com,搜素材        }
soscw.com,搜素材soscw.com,搜素材/// soscw.com,搜素材        /// 获取两个连续引号变成单个引号的数据行
soscw.com,搜素材        /// soscw.com,搜素材        /// 文件数据行
soscw.com,搜素材        /// soscw.com,搜素材        private string GetDeleteQuotaDataLine(string fileDataLine)
soscw.com,搜素材{
soscw.com,搜素材            return fileDataLine.Replace("\\"\\"", "\\"");
soscw.com,搜素材        }
soscw.com,搜素材soscw.com,搜素材/// soscw.com,搜素材        /// 判断字符串是否包含奇数个引号
soscw.com,搜素材        /// soscw.com,搜素材        /// 数据行
soscw.com,搜素材        /// 为奇数时,返回为真;否则返回为假soscw.com,搜素材        private bool IfOddQuota(string dataLine)
soscw.com,搜素材{
soscw.com,搜素材            int quotaCount;
soscw.com,搜素材            bool oddQuota;
soscw.com,搜素材soscw.com,搜素材            quotaCount = 0;
soscw.com,搜素材            for (int i = 0; i {
soscw.com,搜素材                if (dataLine[i] == ‘\\"‘)
soscw.com,搜素材{
soscw.com,搜素材                    quotaCount++;
soscw.com,搜素材                }
soscw.com,搜素材            }
soscw.com,搜素材


评论


亲,登录后才可以留言!