开发者

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

开发者 https://www.devze.com 2023-02-06 10:41 出处:网络 作者: 海盗1234
目录Csv文件基本的属性Csv读写方式方式一:一次性读写方式二:使用文件流形式读写Csv文件读写DataTable类型Csv文件基本的属性
目录
  • Csv文件基本的属性
  • Csv读写方式
    • 方式一:一次性读写
    • 方式二:使用文件流形式读写
  • Csv文件读写DataTable类型

    Csv文件基本的属性

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

    在表格中打开:

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

    在记事本中打开:

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

    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.Lhttp://www.devze.comength; 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格式开发者_Go培训错误:表格各行列数不一致");
                 }
    
             }
         }
    
    
         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:
           javascript                      throw new Exception("CSV格式错误:表格各行列数不一致");
                         }
    
                     }
                 }
             }
         }
    
       php  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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号