網站首頁 編程語言 正文
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; }
原文鏈接:https://blog.csdn.net/qq_39427511/article/details/128378751
相關推薦
- 2022-06-18 C++?詳細講解對象的構造順序_C 語言
- 2022-01-28 Hyper集成laravel中使用的blade模板
- 2023-11-20 python設置matplotlib.plot的坐標刻度和坐標范圍
- 2022-06-16 C語言通過案例講解并發編程模型_C 語言
- 2022-09-10 Python并發編程多進程,多線程及GIL全局解釋器鎖_python
- 2022-02-24 JDBC中在結果集中以列順序獲取值時注意類型匹配
- 2022-08-13 前端less入門
- 2023-04-18 Python中selenium獲取token的方法_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支