一、CSV文件规则

 

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

相关文章:

  • 2021-11-01
  • 2021-12-05
  • 2021-09-17
  • 2022-12-23
  • 2021-12-14
  • 2021-08-17
  • 2021-07-06
猜你喜欢
  • 2021-09-05
  • 2022-12-23
  • 2022-03-08
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案