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