Csv文件操作(創(chuàng)建、讀取、寫入、修改)
Csv文件,又稱逗號(hào)分隔值文件,文件以純文本的形式存儲(chǔ)表格數(shù)據(jù),所以csv也是種殊的表格。
純文本就意味著該文件必須像二進(jìn)制文件那樣解析,使用記事本打開,可以看到數(shù)據(jù)都是以逗號(hào)分隔。
csv文件由任意條數(shù)據(jù)組成,記錄間以換行符分隔,每條數(shù)據(jù)字段間以逗號(hào)分隔。
csv文件跟Excel文件雖然都是表格文件,但是格式還有有很大不同的,Excel文件用文本編輯器打開是堆亂碼,csv文件用文本編輯器打開就是以逗號(hào)分隔的數(shù)據(jù)。
csv文件的出現(xiàn)就是為了實(shí)現(xiàn)簡(jiǎn)單的數(shù)據(jù)存儲(chǔ),是種純文本的文件,*廣泛的應(yīng)用是在程序之間轉(zhuǎn)移表格數(shù)據(jù),能夠兼容各種程序,那么面對(duì)這樣的文件類型該如何創(chuàng)建、讀取、寫入、修改呢。
創(chuàng)建csv文件
Csv文件是純文本文檔,只需要按照定的格式保存文檔,然后添加后綴.csv即可。
定的格式:以換行分隔符分割每行,以逗號(hào)分割每列。
構(gòu)建DataTable數(shù)據(jù),創(chuàng)建csv文檔(第種寫法)
using Excel; using OfficeOpenXml; using System; using System.Data; using System.IO; using System.Text; using UnityEngine; public class Demo5 : MonoBehaviour { void Start() { } // 將DataTable中數(shù)據(jù)寫入到CSV文件中 public static void SaveCSV(string filePath,DataTable dt) { FileInfo fi = new FileInfo(filePath); if (!fi.Directory.Exists) { fi.Directory.Create(); } using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write)) { using (StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8)) { string data = ""; //寫入表頭 for (int i = 0; i < dt.Columns.Count; i++) { data += dt.Columns[i].ColumnName.ToString(); if (i < dt.Columns.Count - 1) { data += ","; } } sw.WriteLine(data); //寫入每行每列的數(shù)據(jù) for (int i = 0; i < dt.Rows.Count; i++) { data = ""; for (int j = 0; j < dt.Columns.Count; j++) { string str = dt.Rows[i][j].ToString(); data += str; if (j < dt.Columns.Count - 1) { data += ","; } } sw.WriteLine(data); } sw.Close(); fs.Close(); } } } }因?yàn)檫@個(gè)函數(shù)需要傳遞進(jìn)去個(gè)數(shù)據(jù)表DataTable數(shù)據(jù),所以,我們要先構(gòu)建個(gè)DataTable數(shù)據(jù),在這里就演示下如何創(chuàng)建DataTable數(shù)據(jù):
構(gòu)建DataTable
using Excel; using OfficeOpenXml; using System; using System.Data; using System.IO; using System.Text; using UnityEngine; public class Demo5 : MonoBehaviour { void Start() { //創(chuàng)建表 設(shè)置表名 DataTable dt = new DataTable("Sheet1"); //創(chuàng)建列 有三列 dt.Columns.Add("名字"); dt.Columns.Add("年齡"); dt.Columns.Add("性別"); //創(chuàng)建行 每行有三列數(shù)據(jù) DataRow dr = dt.NewRow(); dr["column0"] = "張三"; dr["column1"] = "18"; dr["column2"] = "男"; dt.Rows.Add(dr); //取值 第行的123列的數(shù)據(jù) Debug.Log(dt.Rows[0][0].ToString()); Debug.Log(dt.Rows[0][1].ToString()); Debug.Log(dt.Rows[0][2].ToString()); } }有了數(shù)據(jù)表數(shù)據(jù),就可以去創(chuàng)建csv文件了
using Excel; using OfficeOpenXml; using System; using System.Data; using System.IO; using System.Text; using UnityEngine; public class Demo5 : MonoBehaviour { void Start() { //創(chuàng)建表 設(shè)置表名 DataTable dt = new DataTable("Sheet1"); //創(chuàng)建列 有三列 dt.Columns.Add("名字"); dt.Columns.Add("年齡"); dt.Columns.Add("性別"); //創(chuàng)建行 每行有三列數(shù)據(jù) DataRow dr = dt.NewRow(); dr["名字"] = "張三"; dr["年齡"] = "18"; dr["性別"] = "男"; dt.Rows.Add(dr); string filePath = Application.streamingAssetsPath + "\\data.csv"; SaveCSV(filePath, dt); } // 將DataTable中數(shù)據(jù)寫入到CSV文件中 public static void SaveCSV(string filePath,DataTable dt) { FileInfo fi = new FileInfo(filePath); if (!fi.Directory.Exists) { fi.Directory.Create(); } using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write)) { using (StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8)) { string data = ""; //寫入表頭 for (int i = 0; i < dt.Columns.Count; i++) { data += dt.Columns[i].ColumnName.ToString(); if (i < dt.Columns.Count - 1) { data += ","; } } sw.WriteLine(data); //寫入每行每列的數(shù)據(jù) for (int i = 0; i < dt.Rows.Count; i++) { data = ""; for (int j = 0; j < dt.Columns.Count; j++) { string str = dt.Rows[i][j].ToString(); data += str; if (j < dt.Columns.Count - 1) { data += ","; } } sw.WriteLine(data); } sw.Close(); fs.Close(); } } } }
構(gòu)建DataTable數(shù)據(jù),創(chuàng)建csv文檔(第二種寫法)
using Excel; using OfficeOpenXml; using System; using System.Data; using System.IO; using System.Text; using UnityEngine; public class Demo5 : MonoBehaviour { void Start() { //創(chuàng)建表 設(shè)置表名 DataTable dt = new DataTable("Sheet1"); //創(chuàng)建列 有三列 dt.Columns.Add("名字"); dt.Columns.Add("年齡"); dt.Columns.Add("性別"); //創(chuàng)建行 每行有三列數(shù)據(jù) DataRow dr = dt.NewRow(); dr["名字"] = "張三"; dr["年齡"] = "18"; dr["性別"] = "男"; dt.Rows.Add(dr); string filePath = Application.streamingAssetsPath + "\\data.csv"; SaveCSV(filePath, dt); } public void SaveCSV(string CSVPath, DataTable mSheet) { //判斷數(shù)據(jù)表內(nèi)是否存在數(shù)據(jù) if (mSheet.Rows.Count < 1) return; //讀取數(shù)據(jù)表行數(shù)和列數(shù) int rowCount = mSheet.Rows.Count; int colCount = mSheet.Columns.Count; //創(chuàng)建個(gè)StringBuilder存儲(chǔ)數(shù)據(jù) StringBuilder stringBuilder = new StringBuilder(); //讀取數(shù)據(jù) for (int i = 0; i < mSheet.Columns.Count; i++) { stringBuilder.Append(mSheet.Columns[i].ColumnName + ","); } stringBuilder.Append("\r\n"); for (int i = 0; i < rowCount; i++) { for (int j = 0; j < colCount; j++) { //使用","分割每個(gè)數(shù)值 stringBuilder.Append(mSheet.Rows[i][j] + ","); } //使用換行符分割每行 stringBuilder.Append("\r\n"); } //寫入文件 using (FileStream fileStream = new FileStream(CSVPath, FileMode.Create, FileAccess.Write)) { using (TextWriter textWriter = new StreamWriter(fileStream,Encoding.UTF8)) { textWriter.Write(stringBuilder.ToString()); } } } }
讀取csv文件
讀取csv文件就沒啥好說的,就是將讀取的數(shù)據(jù)保存到DataTable數(shù)據(jù)表中,然后讀取數(shù)據(jù)表里面的數(shù)據(jù)即可:
using Excel; using OfficeOpenXml; using System; using System.Data; using System.IO; using System.Text; using UnityEngine; public class Demo5 : MonoBehaviour { void Start() { string filePath = Application.streamingAssetsPath + "\\data.csv"; DataTable dt = OpenCSV(filePath); Debug.Log(dt.Rows[0][0]); Debug.Log(dt.Rows[0][1]); Debug.Log(dt.Rows[0][2]); } public static DataTable OpenCSV(string filePath)//從csv讀取數(shù)據(jù)返回table { DataTable dt = new DataTable(); using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { using (StreamReader sr = new StreamReader(fs, Encoding.UTF8)) { //記錄每次讀取的行記錄 string strLine = ""; //記錄每行記錄中的各字段內(nèi)容 string[] aryLine = null; string[] tableHead = null; //標(biāo)示列數(shù) int columnCount = 0; //標(biāo)示是否是讀取的第行 bool IsFirst = true; //逐行讀取CSV中的數(shù)據(jù) while ((strLine = sr.ReadLine()) != null) { if (IsFirst == true) { tableHead = strLine.Split(','); IsFirst = false; columnCount = tableHead.Length; //創(chuàng)建列 for (int i = 0; i < columnCount; i++) { DataColumn dc = new DataColumn(tableHead[i]); dt.Columns.Add(dc); } } else { aryLine = strLine.Split(','); DataRow dr = dt.NewRow(); for (int j = 0; j < columnCount; j++) { dr[j] = aryLine[j]; } dt.Rows.Add(dr); } } if (aryLine != null && aryLine.Length > 0) { dt.DefaultView.Sort = tableHead[0] + " " + "asc"; } sr.Close(); fs.Close(); return dt; } } } }
csv文件就是個(gè)純文本的文件,所以可以使用純文本的形式去讀取文件,保存文件。之所以用DataTable數(shù)據(jù)表,就是因?yàn)檫@個(gè)數(shù)據(jù)結(jié)構(gòu)讀取、保存、使用數(shù)據(jù)都比較的方便。
本文來自網(wǎng)絡(luò),版權(quán)歸原作者所有
- 上一篇:matlab 讀取串口傳感器數(shù)據(jù) 2022/12/10
- 下一篇:Excel文件操作(創(chuàng)建、讀取、寫入、修改) 2022/9/11