Unity3D对CSV文件操作(创建、读取、写入、修改)

系列文章目录

Unity工具


文章目录

  • 系列文章目录
  • 前言
  • 一、Csv是什么?
  • 二、创建csv文件
    • 2-1、构建表数据
    • 2-2、创建表方法
    • 2-3、完整的脚本(第一种方式)
    • 2-4、运行结果
    • 2-5、完整的脚本(第二种方式)
    • 2-6、运行结果
    • 2-7、想用哪种方式都可以
  • 三、读取csv文件
    • 3-1、代码实现
    • 3-1、读取结果
  • 总结


大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

前言

在程序开发中,经常会遇到要从外部文件中读取数据的情况,文件类型也比较多。

常见的文件类型:Txt、Json、Xml、Excel、Csv、
本文就是Csv文件操作
这是对Excel文件的操作
简单记录一下,方便使用


提示:以下是本篇文章正文内容,下面案例可供参考

一、Csv是什么?

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

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

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

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

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

以下就是csv文件的详解:

二、创建csv文件

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

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

2-1、构建表数据

  //创建数据
    public void FoundTable()
    {
        //创建表 设置表名
        DataTable dt = new DataTable("Sheet1");
        //创建列 有三列
        dt.Columns.Add("名字");
        dt.Columns.Add("年龄");
        dt.Columns.Add("性别");
        //创建行 每一行有三列数据
        DataRow dr = dt.NewRow();
        dr["column0"] = "张三";
        dr["column1"] = "28";
        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());


    }

2-2、创建表方法

  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();
            }
        }
    }

2-3、完整的脚本(第一种方式)

using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using UnityEngine;

public class CreateDataCSV : MonoBehaviour
{
    public string csvurl;
    DataTable dtt;
    // Start is called before the first frame update
    void Start()
    {
        csvurl = Application.streamingAssetsPath+"/123456.csv";
        FoundTable();
        SaveCSV(csvurl, dtt);
    }
    //创建数据
    public void FoundTable()
    {
        //创建表 设置表名
        DataTable dt = new DataTable("Sheet1");
        //创建列 有三列
        dt.Columns.Add("名字");
        dt.Columns.Add("年龄");
        dt.Columns.Add("性别");
        //创建行 每一行有三列数据
        DataRow dr = dt.NewRow();
        dr[0] = "张三";
        dr[1] = "28";
        dr[2] = "女";
        dt.Rows.Add(dr);
        dtt = dt;
        //取值 第一行的123列的数据
        Debug.Log(dt.Rows[0][0].ToString());
        Debug.Log(dt.Rows[0][1].ToString());
        Debug.Log(dt.Rows[0][2].ToString());


    }
    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();
            }
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

脚本随便挂到一个地方即可

2-4、运行结果

在这里插入图片描述
在这里插入图片描述

2-5、完整的脚本(第二种方式)

using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Text;
using UnityEngine;

public class CreateDataCSV1 : MonoBehaviour
{
    public string csvurl;
    DataTable dtt;
    // Start is called before the first frame update
    void Start()
    {
        csvurl = Application.streamingAssetsPath+"/123456.csv";
        FoundTable();
        SaveCSV(csvurl, dtt);
    }
    //创建数据
    public void FoundTable()
    {
        //创建表 设置表名
        DataTable dt = new DataTable("Sheet1");
        //创建列 有三列
        dt.Columns.Add("名字");
        dt.Columns.Add("年龄");
        dt.Columns.Add("性别");
        //创建行 每一行有三列数据
        DataRow dr = dt.NewRow();
        dr[0] = "圣诞节啊";
        dr[1] = "28";
        dr[2] = "女";
        dt.Rows.Add(dr);
        dtt = dt;
        //取值 第一行的123列的数据
        Debug.Log(dt.Rows[0][0].ToString());
        Debug.Log(dt.Rows[0][1].ToString());
        Debug.Log(dt.Rows[0][2].ToString());


    }
    public static void SaveCSV(string filePath, DataTable dt)
    {
        //判断数据表内是否存在数据
        if (dt.Rows.Count < 1)
            return;

        //读取数据表行数和列数
        int rowCount = dt.Rows.Count;
        int colCount = dt.Columns.Count;

        //创建一个StringBuilder存储数据
        StringBuilder stringBuilder = new StringBuilder();

        //读取数据
        for (int i = 0; i < dt.Columns.Count; i++)
        {
            stringBuilder.Append(dt.Columns[i].ColumnName + ",");
        }
        stringBuilder.Append("\r\n");
        for (int i = 0; i < rowCount; i++)
        {
            for (int j = 0; j < colCount; j++)
            {
                //使用","分割每一个数值
                stringBuilder.Append(dt.Rows[i][j] + ",");
            }
            //使用换行符分割每一行
            stringBuilder.Append("\r\n");
        }

        //写入文件
        using (FileStream fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
        {
            using (TextWriter textWriter = new StreamWriter(fileStream, Encoding.UTF8))
            {
                textWriter.Write(stringBuilder.ToString());
            }
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

2-6、运行结果

在这里插入图片描述
在这里插入图片描述

2-7、想用哪种方式都可以

三、读取csv文件

3-1、代码实现

using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Text;
using UnityEngine;

public class RedCSV : MonoBehaviour
{
    void Start()
    {
        string filePath = Application.streamingAssetsPath + "/123456.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;
            }
        }
    }
}

3-1、读取结果

在这里插入图片描述


总结

要记得csv文件就是一个纯文本的文件,所以可以使用纯文本的形式去读取文件,保存文件。

之所以用DataTable数据表,就是因为这个数据结构读取、保存、使用数据都非常的方便。

当然也可以使用数组或者自定义类去解析csv文件,只要是按照换行符进行分割,然后按照逗号进行分割列即可
不定时更新Unity开发技巧,觉得有用记得一键三连哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/222374.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【性能测试】业务/吞吐量与存量数据设计关系+压测常见解决方案

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、性能测试中业务…

设计模式之GoF23介绍

深入探讨设计模式&#xff1a;构建可维护、可扩展的软件架构 一、设计模式的背景1.1 什么是设计模式1.2 设计模式的历史 二、设计模式的分类2.1 创建型模式2.2 结构型模式2.3 行为型模式 三、七大设计原则四、设计模式关系结论 :rocket: :rocket: :rocket: 在软件开发领域&…

软件工程之系统质量

从公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一 、质量标准化 1.什么是质量标准化 通过标准化各条业务线的研发流程&#xff0c;以做的比较好的业务线作为标准样板间&#xff0c;规范出一套标…

使用squid配置高匿代理

背景介绍 为什么要设置高匿代理&#xff1f; 在家和开放平台交互的时候&#xff0c;需要设置白名单&#xff0c;否则无法交互。家里的白名单一直变。 服务部署到服务器太麻烦&#xff0c;调试不方便。 于是就想通过代理的方式&#xff0c;让服务器替我发送这次请求&#xf…

使用Java语言进行账户登录和密码输入

一、操作原理 使用Scanner扫描器进行扫描&#xff0c;使用if语句、if-else语句和else进行账户和密码的验证。 二、相关代码 import java.util.Scanner; public class CheckLoginDemo {public static void main(String[] args){try (Scanner scan new Scanner(System.in)) …

方格取数问题

更好的阅读体验 方格取数。 题目&#xff1a;方格取数 设有 NN 的方格图&#xff0c;我们在其中的某些方格中填入正整数&#xff0c;而其它的方格中则放入数字0。如下图所示&#xff1a; 某人从图中的左上角 A 出发&#xff0c;可以向下行走&#xff0c;也可以向右行走&#x…

设备制造行业CRM:提升客户满意度,驱动业务增长

设备制造行业客户需求多样化、服务链路长&#xff0c;企业在关注APS、EMS等工业软件之余还要以客户为中心&#xff0c;做好客户服务。设备制造行业CRM管理系统是企业管理客户关系的利器&#xff0c;设备制造行业CRM的作用有哪些&#xff1f;一文带您看懂。 设备制造行业需要解…

金蝶云星空单据编辑界面,不允许批量填充操作

文章目录 金蝶云星空单据编辑界面&#xff0c;不允许批量填充操作案例演示开发设计测试 金蝶云星空单据编辑界面&#xff0c;不允许批量填充操作 案例演示 售后单&#xff0c;明细信息单据体&#xff0c;物料编码字段禁止批量填充。 开发设计 编写表单插件&#xff0c;在Be…

绝地求生游戏一定要先训练吗?

绝地求生&#xff08;PlayerUnknowns Battlegrounds&#xff0c;简称PUBG&#xff09;作为一款大热的多人在线生存游戏&#xff0c;自上线以来一直备受玩家追捧。对于新手玩家来说&#xff0c;刚接触这款游戏时常常觉得难以上手&#xff0c;需要进行一定的训练才能够在游戏中取…

Java毕业设计—vue+SpringBoot人事管理OA系统前后端分离

1&#xff0c;项目介绍 本系统主要分四个模块&#xff0c;分别是系统管理和权限管理、薪资管理、考勤管理 2&#xff0c;技术框架 前端 Vue、Axios、ElementUI、Vue-Router、Vuex、ECharts后端 Spring Boot、JWT、MyBatis-Plus、MySQL、Hutool 3&#xff0c;开发环境 JAVA…

【刘二大人】pytorch深度学习实践(三):如何实现线性模型的反向传播+代码实现详解(Tensor、backward函数)

目录 参考资料一、反向传播流程1.1 问题1.2 方法1.3 步骤1.4 例题 二、Pytorch中前向传播和反馈的计算2.1 tensor数据类型2.2 定义线性模型并且计算损失2.2.1 torch.tensor.item()2.2.2 代码 2.3 反向传播2.3.1 torch.tensor.backward()2.3.2 tensor.zero_( )2.3.3 代码实现 三…

企业机密无忧!好用的文件加密系统大揭秘,尽在这里!

由于众多企业内部都存储着大量机密数据&#xff0c;以电子文档形式存在&#xff0c;且传播手段多样&#xff0c;文件泄密问题容易发生。员工通过网络泄密重要文件&#xff0c;或黑客入侵窃取机密数据等情况&#xff0c;都可能导致企业业务和声誉受到严重损害。因此&#xff0c;…

C++断言assert

2023年12月6日&#xff0c;周三上午 在C中&#xff0c;assert 是一个宏定义&#xff0c;用于在程序运行期间检查一些条件是否满足。如果条件不满足&#xff0c;则 assert 会终止程序并输出一条错误消息。 assert 宏定义的语法如下&#xff1a; #include <cassert>asser…

【ESP8266】ESP8266集成开发环境对比

当涉及到ESP8266开发环境的选择时&#xff0c;有几个常见的选择可供开发人员使用。在本篇文章中&#xff0c;我们将对比一些目前最流行的ESP8266集成开发环境&#xff08;IDE&#xff09;&#xff0c;以帮助您选择最适合您的需求的开发环境。 总结&#xff1a;Arduino IDE和Pl…

学校图书管理系统的开发

目 录 摘要 1 Abstract. 1 1 引言 2 1.1 图书管理的现状 2 1.2 现有图书管理系统的概述 3 1.3 选题的目的、意义 3 1.4 图书管理系统的可行性分析 4 1.5 系统开发运行环境 4 2 图书管理系统开发相关技术的介绍 5 2.1 Asp.net的介绍 5 2.1.1 Asp.net的优势介绍 5 2.1.2 Asp.net…

codeforces 题目 Fadi and LCM

目录 题目&#xff1a; 题目描述&#xff1a; 思路&#xff1a; AC代码&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 给你一个长整型 X ①你需要找到一对 a 和 b &#xff0c;使得 LCM&#xff08;a&#xff0c;b&#xff09; X ②你需要保证 max(a&#xff…

智能优化算法应用:基于水基湍流算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于水基湍流算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于水基湍流算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.水基湍流算法4.实验参数设定5.算法结果6.参考…

css 字体添加外轮廓

color: #ffeb3b; -webkit-text-stroke: 10px transparent; background: linear-gradient(90deg,#5d3d02f5,#5d3d02f5,#5d3d02f5,#5d3d02f5,#5d3d02f5,#5d3d02f5,#5d3d02f5) top left / 100% 100%; -webkit-background-clip: text;

「Verilog学习笔记」无占空比要求的奇数分频

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 timescale 1ns/1nsmodule odd_div ( input wire rst ,input wire clk_in,output wire clk_out5 ); //*************code***********//reg [1:0] data ;reg […

class035 数据结构设计高频题【算法】

class035 数据结构设计高频题【算法】 算法讲解035【必备】数据结构设计高频题 code1 设计有setAll功能的哈希表 // setAll功能的哈希表 // 测试链接 : https://www.nowcoder.com/practice/7c4559f138e74ceb9ba57d76fd169967 // 请同学们务必参考如下代码中关于输入、输出…