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

news2024/11/25 20:25:11

系列文章目录

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开发技巧,觉得有用记得一键三连哦。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于STM32 HAL库的光电传感器驱动程序实例

本文将使用STM32 HAL库编写一个光电传感器的驱动程序示例。首先&#xff0c;我们会介绍光电传感器的工作原理和应用场景。然后&#xff0c;我们将讲解如何选择合适的STM32芯片和光电传感器组合。接下来&#xff0c;我们会详细介绍使用STM32 HAL库编写光电传感器驱动程序的基本步…

AVFormatContext封装层:理论与实战

文章目录 前言一、封装格式简介1、FFmpeg 中的封装格式2、查看 FFmpeg 支持的封装格式 二、API 介绍三、 实战 1&#xff1a;解封装1、原理讲解2、示例源码 13、运行结果 14、示例源码 25、运行结果 2 三、 实战 2&#xff1a;转封装1、原理讲解2、示例源码3、运行结果 前言 A…

Docker中部署ElasticSearch 和Kibana,用脚本实现对数据库资源的未授权访问

图未保存&#xff0c;不过文章当中的某一步骤可能会帮助到您&#xff0c;那么&#xff1a;感恩&#xff01; 1、docker中拉取镜像 #拉取镜像 docker pull elasticsearch:7.7.0#启动镜像 docker run --name elasticsearch -d -e ES_JAVA_OPTS"-Xms512m -Xmx512m" -e…

删除误提交的 git commit

背景描述 某次的意外 commit 中误将密码写到代码中并且 push 到了 remote repo 里面, 本文将围绕这个场景讨论如何弥补. 模拟误提交操作 在 Gitee 创建一个新的 Repo, clone 到本地 git clone https://gitee.com/lpwm/myrepo.git创建两个文件, commit 后 push 到 remote 作…

JSON 语法详解:轻松掌握数据结构(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

CSS中 设置文字下划线 的几种方法

在网页设计和开发中&#xff0c;我们经常需要对文字进行样式设置&#xff0c;包括字体,颜色&#xff0c;大小等&#xff0c;其中&#xff0c;设置文字下划线是一种常见需求 一 、CSS种使用 text-decoration 属性来设置文字的装饰效果&#xff0c;包括下划线。 常用的取值&…

JFrog----基于Docker方式部署JFrog

文章目录 1 下载镜像2 创建数据挂载目录3 启动 JFrog服务4 浏览器登录5 重置密码6 设置 license7 设置 Base URL8 设置代理9 选择仓库类型10 预览11 查看结果 1 下载镜像 免费版 docker pull docker.bintray.io/jfrog/artifactory-oss体验版&#xff1a; docker pull releas…

【网络奇缘】- 如何自己动手做一个五类|以太网|RJ45|网络电缆

​ ​ &#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏: 一见倾心,再见倾城 --- 计算机网络~&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 本篇文章关于计算机网络的动手小实验---如何自己动手做一个网线&#xff0c; 也是为后面的物理层学习进…

在cmd下查看当前python的版本

在cmd窗口下运行python --version或者py --version&#xff0c;可以查看当前python的版本。例如&#xff1a;

OpenAI在中国,申请GPT-6、GPT-7商标

根据最新商标信息显示&#xff0c;OpenAI已经在中国提交了GPT-6和GPT-7的商标注册信息&#xff0c;分类是科学仪器和网站服务两大类。申请日期是今年的11月2日&#xff0c;目前处于审核状态。 该申请由知识产权代理公司完成&#xff0c;但申请人的地址正是OpenAI在美国公司的地…

LeetCode437.路径总和III

看完题目我就拿直接用递归写了如下代码&#xff1a; class Solution {private int ans;public int pathSum(TreeNode root, int targetSum) {ans 0;dfs(root, targetSum, 0);return ans;}public void dfs(TreeNode root, int targetSum, int sum){if(root null)return;sum r…

【MATLAB】辛几何模态分解分解+FFT+HHT组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 辛几何模态分解&#xff08;CEEMDAN&#xff09;是一种处理非线性和非平稳信号的适应性信号分解方法。通过在信号中加入白噪声&#xff0c;并多次进行经验模态分解&#xff08;EMD&#…

CSS BFC特性和应用

目录 1&#xff0c;介绍2&#xff0c;BFC布局规则3&#xff0c;创建BFC4&#xff0c;BFC应用1&#xff0c;浮动子元素使父级高度坍塌2&#xff0c;非浮动元素被浮动元素覆盖3&#xff0c;margin 合并1&#xff0c;父子 margin 合并&#xff1a;父级和第1个/最后1个子元素2&…

【matlab程序】matlab画子图的多种样式

【matlab程序】matlab画子图的多种样式

Ps:文字操作常用快捷键

对文字的设置操作&#xff0c;可在工具选项栏或“字符”面板上进行。但是&#xff0c;如果能记住并使用快捷键&#xff0c;可大大提高工作效率。 设置文字颜色 Color 1、选中几个或全部文字后&#xff0c;除了使用工具选项栏上的“颜色”按钮&#xff0c;还可以使用快捷键 Alt…

【Vue】将官方路由管理器 vue-router 库引入 Vue 项目的三种方法

前言 Vue Router 是 Vue.js 的官方路由管理器。它可以帮助我们在 Vue 应用中实现页面之间的跳转和导航&#xff0c;并且提供了一些高级功能&#xff0c;如路由参数、路由嵌套、路由守卫等。 Vue Router 的主要作用是将不同的组件映射到不同的 URL&#xff0c;并根据 URL 的变化…

UE5 - 把ArchvizExplorer项目改造成自己的数字孪生项目 - 开发记要

参考&#xff1a; https://blog.csdn.net/qq_17523181/article/details/133853099 https://blog.csdn.net/qq_17523181/article/details/134455597 1. 安装项目 https://www.unrealengine.com/marketplace/zh-CN/product/archviz-explorer https://karldetroit.com/archviz-exp…

IDEA中,光标移动快捷键(Shift + 滚轮前后滚动:当前文件的横向滚动轴滚动。)

除此之外&#xff0c;其他常用的光标移动快捷键包括&#xff1a; Shift 滚轮前后滚动&#xff1a;当前文件的横向滚动轴滚动。Shiftenter&#xff1a;快速将鼠标移动到下一行。Ctrl ]&#xff1a;移动光标到当前所在代码的花括号结束位置。Ctrl 左方向键&#xff1a;光标跳转…

华为鸿蒙开发——Stage/FA模型在ArkTs语言、JS语言 实现页面互转

文章目录 一、ArkTs(Stage模型)二、ArkTs(FA模型)三、JS&#xff08;FA模型&#xff09; 一、ArkTs(Stage模型) 目的&#xff1a;实现两个页面的跳转功能 步骤&#xff1a; 1、打开entry > src > main > ets > pages 2、在默认页面基础上&#xff0c;我们添加一个…

线性表之-栈

栈的表示&#xff1a; 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff…