• 您的位置:首页 > 新闻动态 > Unity3D

    Csv文件操作(创建、读取、写入、修改)

    2022/9/11      点击:

    Csv文件,又称逗号分隔值文件,文件以纯文本的形式存储表格数据,所以csv也是一种特殊的表格。

    纯文本就意味着该文件必须像二进制文件那样解析,使用记事本打开,可以看到数据都是以逗号分隔。

    csv文件由任意条数据组成,记录间以换行符分隔,每条数据字段间以逗号分隔。

    csv文件跟Excel文件虽然都是表格文件,但是格式还有有很大不同的,Excel文件用文本编辑器打开是一堆乱码,csv文件用文本编辑器打开就是以逗号分隔的数据。

    csv文件的出现就是为了实现简单的数据存储,是一种纯文本的文件,*广泛的应用是在程序之间转移表格数据,能够兼容各种程序,那么面对这样的文件类型该如何创建、读取、写入、修改呢。


    创建csv文件

    Csv文件是纯文本文档,只需要按照特定的格式保存文档,然后添加后缀.csv即可。

    特定的格式:以换行分隔符分割每一行,以逗号分割每一列。

    构建DataTable数据,创建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中数据写入到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);
                    //写入每一行每一列的数据
                    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();
                }
            }
        }
    }
    因为这个函数需要传递进去一个数据表DataTable数据,所以,我们要先构建一个DataTable数据,在这里就演示一下如何创建DataTable数据:


    构建DataTable


    using Excel;
    using OfficeOpenXml;
    using System;
    using System.Data;
    using System.IO;
    using System.Text;
    using UnityEngine;
    
    public class Demo5 : MonoBehaviour
    {
        void Start()
        {
            //创建表 设置表名
            DataTable dt = new DataTable("Sheet1");
            //创建列 有三列
            dt.Columns.Add("名字");
            dt.Columns.Add("年龄");
            dt.Columns.Add("性别");
            //创建行 每一行有三列数据
            DataRow dr = dt.NewRow();
            dr["column0"] = "张三";
            dr["column1"] = "18";
            dr["column2"] = "男";
            dt.Rows.Add(dr);
            //取值 第一行的123列的数据
            Debug.Log(dt.Rows[0][0].ToString());
            Debug.Log(dt.Rows[0][1].ToString());
            Debug.Log(dt.Rows[0][2].ToString());
        }
    }
    有了数据表数据,就可以去创建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 dt = new DataTable("Sheet1");
            //创建列 有三列
            dt.Columns.Add("名字");
            dt.Columns.Add("年龄");
            dt.Columns.Add("性别");
            //创建行 每一行有三列数据
            DataRow dr = dt.NewRow();
            dr["名字"] = "张三";
            dr["年龄"] = "18";
            dr["性别"] = "男";
            dt.Rows.Add(dr);
            string filePath = Application.streamingAssetsPath + "\\data.csv";
            SaveCSV(filePath, dt);
        }
    
        // 将DataTable中数据写入到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);
                    //写入每一行每一列的数据
                    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();
                }
            }
        }
    }

    构建DataTable数据,创建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 dt = new DataTable("Sheet1");
            //创建列 有三列
            dt.Columns.Add("名字");
            dt.Columns.Add("年龄");
            dt.Columns.Add("性别");
            //创建行 每一行有三列数据
            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)
        {
            //判断数据表内是否存在数据
            if (mSheet.Rows.Count < 1)
                return;
    
            //读取数据表行数和列数
            int rowCount = mSheet.Rows.Count;
            int colCount = mSheet.Columns.Count;
    
            //创建一个StringBuilder存储数据
            StringBuilder stringBuilder = new StringBuilder();
    
            //读取数据
            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++)
                {
                    //使用","分割每一个数值
                    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文件就没啥好说的,就是将读取的数据保存到DataTable数据表中,然后读取数据表里面的数据即可:



    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读取数据返回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 = "";
                    //记录每行记录中的各字段内容
                    string[] aryLine = null;
                    string[] tableHead = null;
                    //标示列数
                    int columnCount = 0;
                    //标示是否是读取的第一行
                    bool IsFirst = true;
                    //逐行读取CSV中的数据
                    while ((strLine = sr.ReadLine()) != null)
                    {
                        if (IsFirst == true)
                        {
                            tableHead = strLine.Split(',');
                            IsFirst = false;
                            columnCount = tableHead.Length;
                            //创建列
                            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文件就是一个纯文本的文件,所以可以使用纯文本的形式去读取文件,保存文件。之所以用DataTable数据表,就是因为这个数据结构读取、保存、使用数据都比较的方便。

    本文来自网络,版权归原作者所有