• Csv文件操作(創(chuàng)建、讀取、寫入、修改)

    2022/9/11??????點(diǎn)擊:

    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)歸原作者所有