广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#Csv实现基本的读写和转换DataTable
  • 540
分享到

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

C#Csv读写C#Csv转换DataTable 2023-02-05 15:02:29 540人浏览 安东尼
摘要

目录Csv文件基本的属性Csv读写方式方式一:一次性读写方式二:使用文件流形式读写Csv文件读写DataTable类型Csv文件基本的属性 csv文件可以在excel或者wps中以表

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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C#Csv实现基本的读写和转换DataTable

本文链接: https://www.lsjlt.com/news/194247.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作