C# Csv实现基本的读写和转换DataTable

.NET
324
0
0
2023-08-02
标签   C#
目录
  • Csv文件基本的属性
  • Csv读写方式
  • 方式一:一次性读写
  • 方式二:使用文件流形式读写
  • Csv文件读写DataTable类型

Csv文件基本的属性

csv文件可以在excel或者wps中以表格形式打开,本质上是每一列以,逗号为分隔符的一种格式,在C#中操作可以把他当做普通txt文本读入,然后通过处理,逗号分隔符来对数据进行处理转换。

在表格中打开:

在这里插入图片描述


在记事本中打开:

在这里插入图片描述

Csv读写方式

方式一:一次性读写

使用File.ReadAllLines一次性读入。File.WriteAllLines一次性写入。

这种方式适合csv文件内容不多的情况下使用。

示例:

string path="data.csv";
 var lines = File.ReadAllLines(path).ToList();

完整的实现:

/// <summary>
/// 读取Csv,返回行集合
/// </summary>
/// <param name="path"></param>
/// <param name="hasTitle"></param>
/// <returns></returns>
public static List<string> ReadCsv(string path, bool hasTitle)
{
    if (!File.Exists(path))
        return new List<string>();
    
    var lines = File.ReadAllLines(path).ToList();
    if (hasTitle)
    {
        lines.RemoveAt();
    }
    return lines;
}

方式二:使用文件流形式读写

使用StreamReader,一行一行的读取文件中的内容,并且处理。写入类似

示例:

using (StreamReader sr = new StreamReader(path))
{

      string line;
      while ((line = sr.ReadLine()) != null)
      {
			//处理行数据
          
          
      }
  }

Csv文件读写DataTable类型

将CSV文件读入数据转成DataTable类型

 /// <summary>
 /// 读取Csv文件,加载到DataTable
 /// </summary>
 /// <param name="path">csv文件路径</param>
 /// <param name="hasTitle">是否有标题行</param>
 /// <param name="SafeLevel">安全等级::错误格式行正常添加;1:错误行忽略(不添加),2:出现错误弹出异常</param>
 /// <returns></returns>
 public static DataTable ReadCsvToDataTable(string path, bool hasTitle = false, int SafeLevel =)
 {

     DataTable dt = new DataTable();
     var lines = ReadCsv(path, false);
     bool isFirst = true;

     foreach (var item in lines)
     {
         string[] values = item.Split(',');
         if (isFirst)
         {
             for (int i =; i < values.Length; i++)
             {
                 dt.Columns.Add();
             }
             if (hasTitle)
             {
                 for (int i =; i < values.Length; i++)
                 {
                     dt.Columns[i].ColumnName = values[i];
                 }
                 continue;
             }
             isFirst = false;
         }
         if (values.Length == dt.Columns.Count)
         {
             dt.Rows.Add(values);
         }
         else
         {
             switch (SafeLevel)
             {
                 case:
                     if (values.Length > dt.Columns.Count)
                     {
                         var res = values.ToList();
                         res.RemoveRange(dt.Columns.Count, values.Length - dt.Columns.Count);
                         dt.Rows.Add(res.ToArray());
                     }
                     else
                     {
                         dt.Rows.Add(values);
                     }
                     break;
                 case:
                     continue;
                 default:
                     throw new Exception("CSV格式错误:表格各行列数不一致");
             }

         }
     }


     return dt;
 }

 /// <summary>
 /// 以文件流形式读取Csv文件,加载到DataTable
 /// </summary>
 /// <param name="path">csv文件路径</param>
 /// <param name="hasTitle">是否有标题行</param>
 /// <param name="SafeLevel">安全等级::错误格式行正常添加;1:错误行忽略(不添加),2:出现错误弹出异常</param>
 /// <returns></returns>
 /// <exception cref="Exception"></exception>
 public static DataTable ReadCsvByStream(string path, bool hasTitle = false, int SafeLevel =)
 {
     DataTable dt = new DataTable();
     bool isFirst = true;

     using (StreamReader sr = new StreamReader(path))
     {

         string line;
         while ((line = sr.ReadLine()) != null)
         {

             string[] values = line.Split(',');
             if (isFirst)
             {
                 for (int i =; i < values.Length; i++)
                 {
                     dt.Columns.Add();
                 }
                 isFirst = false;
             }

             //有表头则添加
             if (hasTitle)
             {
                 for (int i =; i < values.Length; i++)
                 {
                     dt.Columns[i].ColumnName = values[i];
                 }
                 hasTitle = false;
             }
             else
             {
                 if (values.Length == dt.Columns.Count)
                 {
                     dt.Rows.Add(values);
                 }
                 else
                 {
                     switch (SafeLevel)
                     {
                         case:
                             if (values.Length > dt.Columns.Count)
                             {
                                 var res = values.ToList();
                                 res.RemoveRange(dt.Columns.Count, values.Length - dt.Columns.Count);
                                 dt.Rows.Add(res.ToArray());
                             }
                             else
                             {
                                 dt.Rows.Add(values);
                             }
                             break;
                         case:
                             continue;
                         default:
                             throw new Exception("CSV格式错误:表格各行列数不一致");
                     }

                 }
             }
         }
     }

     return dt;
 }

将DataTable类型写入到Csv文件中去

/// <summary>
/// 以文件流形式将DataTable写入csv文件
/// </summary>
/// <param name="dt"></param>
/// <param name="path"></param>
/// <param name="hasTitle"></param>
/// <returns></returns>
public static bool WriteToCsvByDataTable(DataTable dt, string path, bool hasTitle = false)
{
    using (StreamWriter sw = new StreamWriter(path))
    {
        //输出标题行(如果有)
        if (hasTitle)
        {
            for (int i =; i < dt.Columns.Count; i++)
            {
                sw.Write(dt.Columns[i].ColumnName);
                if (i != dt.Columns.Count -)
                {
                    sw.Write(",");
                }
            }
            sw.WriteLine();
        }

        //输出文件内容
        for (int i =; i < dt.Rows.Count; i++)
        {
            for (int j =; j < dt.Columns.Count; j++)
            {
                sw.Write(dt.Rows[i][j].ToString());
                if (j != dt.Columns.Count -)
                {
                    sw.Write(",");
                }
            }
            sw.WriteLine();
        }
    }

    return true;
}