当前位置 : 主页 > 网络编程 > c#编程 >

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

来源:互联网 收集:自由互联 发布时间:2023-03-22
目录 Csv文件基本的属性 Csv读写方式 方式一:一次性读写 方式二:使用文件流形式读写 Csv文件读写DataTable类型 Csv文件基本的属性 csv文件可以在excel或者wps中以表格形式打开,本质上是
目录
  • 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(0);
                }
                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">安全等级:0:错误格式行正常添加;1:错误行忽略(不添加),2:出现错误弹出异常</param>
     /// <returns></returns>
     public static DataTable ReadCsvToDataTable(string path, bool hasTitle = false, int SafeLevel = 0)
     {
    
         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 = 0; i < values.Length; i++)
                 {
                     dt.Columns.Add();
                 }
                 if (hasTitle)
                 {
                     for (int i = 0; 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 0:
                         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 1:
                         continue;
                     default:
                         throw new Exception("CSV格式错误:表格各行列数不一致");
                 }
    
             }
         }
    
    
         return dt;
     }
    
     /// <summary>
     /// 以文件流形式读取Csv文件,加载到DataTable
     /// </summary>
     /// <param name="path">csv文件路径</param>
     /// <param name="hasTitle">是否有标题行</param>
     /// <param name="SafeLevel">安全等级:0:错误格式行正常添加;1:错误行忽略(不添加),2:出现错误弹出异常</param>
     /// <returns></returns>
     /// <exception cref="Exception"></exception>
     public static DataTable ReadCsvByStream(string path, bool hasTitle = false, int SafeLevel = 0)
     {
         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 = 0; i < values.Length; i++)
                     {
                         dt.Columns.Add();
                     }
                     isFirst = false;
                 }
    
                 //有表头则添加
                 if (hasTitle)
                 {
                     for (int i = 0; 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 0:
                                 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 1:
                                 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 = 0; i < dt.Columns.Count; i++)
                {
                    sw.Write(dt.Columns[i].ColumnName);
                    if (i != dt.Columns.Count - 1)
                    {
                        sw.Write(",");
                    }
                }
                sw.WriteLine();
            }
    
            //输出文件内容
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    sw.Write(dt.Rows[i][j].ToString());
                    if (j != dt.Columns.Count - 1)
                    {
                        sw.Write(",");
                    }
                }
                sw.WriteLine();
            }
        }
    
        return true;
    }
    
    

    到此这篇关于C# Csv实现基本的读写和转换DataTable的文章就介绍到这了,更多相关C# Csv读写和转换DataTable内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

    上一篇:C#实现简单的文件加密与解密方式
    下一篇:没有了
    网友评论