服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C# Csv实现基本的读写和转换DataTable

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

2023-03-09 14:42海盗1234 C#

本文主要介绍了C# Csv实现基本的读写和转换DataTable,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Csv文件基本的属性

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

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


在记事本中打开:

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

Csv读写方式

方式一:一次性读写

使用File.ReadAllLines一次性读入。File.WriteAllLines一次性写入。
这种方式适合csv文件内容不多的情况下使用。
示例:

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

完整的实现:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/// <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,一行一行的读取文件中的内容,并且处理。写入类似
示例:

?
1
2
3
4
5
6
7
8
9
10
11
using (StreamReader sr = new StreamReader(path))
{
 
      string line;
      while ((line = sr.ReadLine()) != null)
      {
            //处理行数据
          
          
      }
  }

Csv文件读写DataTable类型

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/// <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文件中去

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/// <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内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_39427511/article/details/128378751

延伸 · 阅读

精彩推荐
  • C#C#使用TextBox作数据输入方法

    C#使用TextBox作数据输入方法

    笔者最近需要上位机与下位机进行数据交互,在广泛参考大佬的资料后,较为完善地使用Textbox控件进行数据输入的功能。感兴趣的可以了解一下...

    怪都督8462022-11-21
  • C#C#插入图片到Excel表格单元格代码详解

    C#插入图片到Excel表格单元格代码详解

    在本篇文章里小编给大家整理了关于C#插入图片到Excel表格单元格的具体方法和实例代码,需要的朋友们可以学习下。...

    sunny蓝鱼3552022-07-28
  • C#C#如何操作Excel数据透视表

    C#如何操作Excel数据透视表

    这篇文章主要为大家详细介绍了C#如何操作Excel数据透视表, 创建透视表、设置行折叠、展开等操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    E-iceblue12032022-02-22
  • C#C#表达式树Expression基础讲解

    C#表达式树Expression基础讲解

    这篇文章介绍了C#表达式树Expression和基本用法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...

    阿波Plus10002022-12-14
  • C#C#实现将Doc文档转换成rtf格式的方法示例

    C#实现将Doc文档转换成rtf格式的方法示例

    这篇文章主要介绍了C#实现将Doc文档转换成rtf格式的方法,结合实例形式分析了C#针对word文件的读取及文档格式转换相关操作技巧,需要的朋友可以参考下...

    a7719485248122022-01-12
  • C#C#中Dictionary<TKey,TValue>排序方式的实现

    C#中Dictionary<TKey,TValue>排序方式的实现

    这篇文章主要介绍了C#中Dictionary<TKey,TValue>排序方式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    浮海扬尘10032022-11-02
  • C#C#3.0使用EventLog类写Windows事件日志的方法

    C#3.0使用EventLog类写Windows事件日志的方法

    这篇文章主要介绍了C#3.0使用EventLog类写Windows事件日志的方法,以简单实例形式分析了C#写windows事件日志的技巧,具有一定参考借鉴价值,需要的朋友可以参考...

    我心依旧5812021-10-22
  • C#Unity shader实现多光源漫反射以及阴影

    Unity shader实现多光源漫反射以及阴影

    这篇文章主要为大家详细介绍了shader实现多光源漫反射以及阴影,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    OwenTA7382022-09-21