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

 公司新闻     |      2019-10-10 12:32

本文实例讲述了c#读取csv格式文件的方法。分享给大家供大家参考。具体实现方法如下:

一、csv文件规则
 
1 开头是不留空,以行为单位。
2 可含或不含列名,含列名则居文件第一行。
3 一行数据不跨行,无空行。
4 以半角逗号作分隔符,列为空也要表达其存在。
5 列内容如存在半角逗号则用半角引号将该字段值包含起来。
6 列内容如存在半角引号则应替换成半角双引号转义,并用半角引号将该字段值包含起来。
7 文件读写时引号,逗号操作规则互逆。
8 内码格式不限,可为 ascii、unicode 或者其他。
9 不支持特殊字符
 
二、c#读取csv文件的方法































































































  /// summary
  /// 获取某行某列的数据
  /// row:行,row = 1代表第一行
  /// col:列,col = 1代表第一列 
  /// /summary
  public string this[int row, int col]
  {
  get
  {
  //数据有效性验证
  checkrowvalid;
  checkcolvalid;
  arraylist colal = this.rowal[row - 1];
  //如果请求列数据大于当前行的列时,返回空值
  if
  {
  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;
  checkmaxrowvalid;
  checkcolvalid;
  checkmaxcolvalid;
  if
  {
  maxrow = rowcount;
  }
  if
  {
  maxcol = colcount;
  }
  if
  {
  throw new exception;
  }
  if
  {
  throw new exception;
  }
  datatable csvdt = new datatable;
  int i;
  int col;
  int row;
  //增加列
  for
  {
  csvdt.columns.add);
  }
  for
  {
  datarow csvdr = csvdt.newrow;
  i = 0;
  for
  {
  csvdr[i] = this[row, col];
  i++;
  }
  csvdt.rows.add;
  }
  return csvdt;
  }
  }























































  /// summary
  /// 检查行数是否是有效的
  /// /summary
  /// param name="col" /param  
  private void checkrowvalid
  {
  if
  {
  throw new exception;
  }
  if
  {
  throw new exception;
  }
  }
  /// summary
  /// 检查最大行数是否是有效的
  /// /summary
  /// param name="col" /param  
  private void checkmaxrowvalid
  {
  if
  {
  throw new exception;
  }
  if
  {
  throw new exception;
  }
  }
  /// summary
  /// 检查列数是否是有效的
  /// /summary
  /// param name="col" /param  
  private void checkcolvalid
  {
  if
  {
  throw new exception;
  }
  if
  {
  throw new exception;
  }
  }
  /// summary
  /// 检查检查最大列数是否是有效的
  /// /summary
  /// param name="col" /param  
  private void checkmaxcolvalid
  {
  if
  {
  throw new exception;
  }
  if
  {
  throw new exception;
  }
  }
  /// summary
  /// 载入csv文件
  /// /summary
  private void loadcsvfile
  {
  //对数据的有效性进行验证
  if
  {
  throw new exception;
  }
  else if )
  {
  throw new exception;
  }
  else
  {
  }
  if
  {
  this.encoding = encoding.default;
  }
  streamreader sr = new streamreader;
  string csvdataline;
  csvdataline = "";
  while
  {
  string filedataline;
  filedataline = sr.readline;
  if
  {
  break;
  }
  if
  {
  csvdataline = filedataline;//getdeletequotadataline;
  }
  else
  {
  csvdataline += "\r " + filedataline;//getdeletequotadataline;
  }
  //如果包含偶数个引号,说明该行数据中出现回车符或包含逗号
  if )
  {
  addnewdataline;
  csvdataline = "";
  }
  }
  sr.close;
  //数据行出现奇数个引号
  if
  {
  throw new exception;
  }
  }
  /// summary
  /// 获取两个连续引号变成单个引号的数据行
  /// /summary
  /// param name="filedataline" 文件数据行 /param
  /// returns /returns
  private string getdeletequotadataline
  {
  return filedataline.replace;
  }
  /// summary
  /// 判断字符串是否包含奇数个引号
  /// /summary
  /// param name="dataline" 数据行 /param
  /// returns 为奇数时,返回为真;否则返回为假 /returns
  private bool ifoddquota
  {
  int quotacount;
  bool oddquota;
  quotacount = 0;
  for
  {
  if
  {
  quotacount++;
  }
  }
  oddquota = false;
  if
  {
  oddquota = true;
  }
  return oddquota;
  }
  /// summary
  /// 判断是否以奇数个引号开始
  /// /summary
  /// param name="datacell" /param
  /// returns /returns
  private bool ifoddstartquota
  {
  int quotacount;
  bool oddquota;
  quotacount = 0;
  for
  {
  if
  {
  quotacount++;
  }
  else
  {
  break;
  }
  }
  oddquota = false;
  if
  {
  oddquota = true;
  }
  return oddquota;
  }
  /// summary
  /// 判断是否以奇数个引号结尾
  /// /summary
  /// param name="datacell" /param
  /// returns /returns
  private bool ifoddendquota
  {
  int quotacount;
  bool oddquota;
  quotacount = 0;
  for
  {
  if
  {
  quotacount++;
  }
  else
  {
  break;
  }
  }
  oddquota = false;
  if
  {
  oddquota = true;
  }
  return oddquota;
  }
  /// summary
  /// 加入新的数据行
  /// /summary
  /// param name="newdataline" 新的数据行 /param
  private void addnewdataline
  {
  //system.diagnostics.debug.writeline;
  ////return;
  arraylist colal = new arraylist;
  string[] dataarray = newdataline.split;
  bool oddstartquota;  //是否以奇数个引号开始
  string celldata;
  oddstartquota = false;
  celldata = "";
  for
  {
  if
  {
  //因为前面用逗号分割,所以要加上逗号
  celldata += "," + dataarray[i];
  //是否以奇数个引号结尾
  if )
  {
  colal.add);
  oddstartquota = false;
  continue;
  }
  }
  else
  {
  //是否以奇数个引号开始
  if )
  {
  //是否以奇数个引号结尾,不能是一个双引号,并且不是奇数个引号
  if && dataarray[i].length 2 && !ifoddquota)
  {
  colal.add);
  oddstartquota = false;
  continue;
  }
  else
  {
  oddstartquota = true;
  celldata = dataarray[i];
  continue;
  }
  }
  else
  {
  colal.add);
  }
  }
  }
  if
  {
  throw new exception;
  }
  this.rowal.add;
  }






































































































































































































































































  /// summary
  /// 去掉格子的首尾引号,把双引号变成单引号
  /// /summary
  /// param name="filecelldata" /param
  /// returns /returns
  private string gethandledata
  {
  if
  {
  return "";
  }
  if )
  {
  if )
  {
  return filecelldata.substring.replace; //去掉首尾引号,然后把双引号变成单引号
  }
  else
  {
  throw new exception;
  }
  }
  else
  {
  //考虑形如""  """"  """""" 
  if
  {
  filecelldata = filecelldata.substring.replace; //去掉首尾引号,然后把双引号变成单引号
  }
  }
  return filecelldata;
  }
  }

































希望本文所述对大家的c#程序设计有所帮助。