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

 更新时间:2023年02月05日 12:22:50   作者:海盗1234  
本文主要介绍了C# 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#图像灰度化、灰度反转、二值化的实现方法详解

    基于c#图像灰度化、灰度反转、二值化的实现方法详解

    本篇文章是对c#图像灰度化、灰度反转、二值化的实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C#中获取二维数组的行数和列数以及多维数组各个维度的长度

    C#中获取二维数组的行数和列数以及多维数组各个维度的长度

    这篇文章介绍了C#中获取二维数组的行数和列数以及多维数组各个维度的长度,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • C#操作Byte数组和十六进制进行互转

    C#操作Byte数组和十六进制进行互转

    这篇文章介绍了C#操作Byte数组和十六进制进行互转的的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • Unity UGUI实现卡片椭圆方向滚动

    Unity UGUI实现卡片椭圆方向滚动

    这篇文章主要为大家详细介绍了UGUI实现卡片椭圆方向滚动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • C#9.0 新特性简介

    C#9.0 新特性简介

    这篇文章主要介绍了C#9.0 新特性简介,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 利用C#如何给PDF文档添加文本与图片页眉

    利用C#如何给PDF文档添加文本与图片页眉

    页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码、日期、公司徽标、文档标题、文件名或作者名等等。那么我们如何以编程的方式添加页眉呢?这篇文章主要介绍了利用C#如何给PDF文档添加文本与图片页眉的相关资料,需要的朋友可以参考下
    2017-01-01
  • C# File类中的文件读写方法详解

    C# File类中的文件读写方法详解

    C#提供了多种操作文件的方案,尤其是File类中封装的静态方法,本文将通过一些简单的示例为大家讲讲C#读写文件的方法,需要的可以参考一下
    2023-05-05
  • c#判断操作系统位数的示例分享

    c#判断操作系统位数的示例分享

    这篇文章主要介绍了c#判断操作系统位数的示例,在.net 4.5中,判断操作系统不用再写方法去判断了,有直接可以利用的属性了哦
    2014-01-01
  • 详解C# 结构体

    详解C# 结构体

    这篇文章主要介绍了C# 结构体的的相关资料,文中示例代码非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • 浅析C#的复制和克隆

    浅析C#的复制和克隆

    这篇文章主要介绍了浅析C#的复制和克隆,需要的朋友可以参考下
    2014-07-07

最新评论