C# Csv實(shí)現(xiàn)基本的讀寫和轉(zhuǎn)換DataTable
Csv文件基本的屬性
csv文件可以在excel或者wps中以表格形式打開,本質(zhì)上是每一列以,
逗號為分隔符的一種格式,在C#中操作可以把他當(dāng)做普通txt文本讀入,然后通過處理,
逗號分隔符來對數(shù)據(jù)進(jìn)行處理轉(zhuǎn)換。
在表格中打開:
在記事本中打開:
Csv讀寫方式
方式一:一次性讀寫
使用File.ReadAllLines
一次性讀入。File.WriteAllLines
一次性寫入。
這種方式適合csv文件內(nèi)容不多的情況下使用。
示例:
string path="data.csv"; var lines = File.ReadAllLines(path).ToList();
完整的實(shí)現(xiàn):
/// <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
,一行一行的讀取文件中的內(nèi)容,并且處理。寫入類似
示例:
using (StreamReader sr = new StreamReader(path)) { string line; while ((line = sr.ReadLine()) != null) { //處理行數(shù)據(jù) } }
Csv文件讀寫DataTable類型
將CSV文件讀入數(shù)據(jù)轉(zhuǎn)成DataTable類型
/// <summary> /// 讀取Csv文件,加載到DataTable /// </summary> /// <param name="path">csv文件路徑</param> /// <param name="hasTitle">是否有標(biāo)題行</param> /// <param name="SafeLevel">安全等級:0:錯誤格式行正常添加;1:錯誤行忽略(不添加),2:出現(xiàn)錯誤彈出異常</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格式錯誤:表格各行列數(shù)不一致"); } } } return dt; } /// <summary> /// 以文件流形式讀取Csv文件,加載到DataTable /// </summary> /// <param name="path">csv文件路徑</param> /// <param name="hasTitle">是否有標(biāo)題行</param> /// <param name="SafeLevel">安全等級:0:錯誤格式行正常添加;1:錯誤行忽略(不添加),2:出現(xiàn)錯誤彈出異常</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格式錯誤:表格各行列數(shù)不一致"); } } } } } 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)) { //輸出標(biāo)題行(如果有) 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(); } //輸出文件內(nèi)容 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; }
到此這篇關(guān)于C# Csv實(shí)現(xiàn)基本的讀寫和轉(zhuǎn)換DataTable的文章就介紹到這了,更多相關(guān)C# Csv讀寫和轉(zhuǎn)換DataTable內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
.net4.5使用async和await異步編程實(shí)例
.net4.5使用async和await異步編程實(shí)例,大家參考使用吧2013-12-12Unity基于ShaderLab實(shí)現(xiàn)光照系統(tǒng)(著色器代碼實(shí)現(xiàn)小結(jié))
這篇文章主要介紹了Unity基于ShaderLab實(shí)現(xiàn)光照系統(tǒng),主要總結(jié)unity中shaderlab的著色器代碼實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01C#實(shí)現(xiàn)定時任務(wù)Task Scheduler的示例代碼
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)定時任務(wù)Task Scheduler的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02Unity 按鈕事件封裝操作(EventTriggerListener)
這篇文章主要介紹了Unity 按鈕事件封裝操作(EventTriggerListener),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04C#去除DataTable重復(fù)數(shù)據(jù)的三種方法
這篇文章主要介紹了C#去除DataTable重復(fù)數(shù)據(jù)的三種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02