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 updatevoid 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 framevoid 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 updatevoid 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 framevoid 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.rhkb.cn/news/212936.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Linux源码趣读》| 好书推荐

目录 一. &#x1f981; 前言二. &#x1f981; 像小说一样趣读 Linux 源码三. &#x1f981; 学习路线 一. &#x1f981; 前言 最近、道然科技给狮子送了两本书&#xff1a;一本是付东来的《labuladong的算法笔记》、一本是闪客著的《Linux源码趣读》&#xff0c;《labulado…

Python并发-线程和进程

一、线程和进程对应的问题 **1.进程&#xff1a;**CPU密集型也叫计算密集型&#xff0c;指的是系统的硬盘、内存性能相对CPU要好很多&#xff0c;此时&#xff0c;系统运作大部分的状况是CPU Loading 100%&#xff0c;CPU要读/写I/O(硬盘/内存)&#xff0c;I/O在很短的时间就可…

ZLMediakit-method ANNOUNCE failed: 401 Unauthorized(ffmpeg、obs推流rtmp到ZLM发现的问题)

错误截图 解决办法&#xff1a;能推流成功&#xff0c;但是不能写入到wvp数据库中 修改配置文件config.ini 改成0 修改之后 重启服务 systemctl restart zlm*推流成功 解决办法&#xff1a;能推流&#xff0c;能写入数据库中 替换zlm版本&#xff0c;可以用我文章中提供的编译…

【STM32入门】3.OLED屏幕

1.OLED引脚 OLED屏幕的接线按图所示&#xff0c;本例中用的是4管脚OLED屏幕 2.驱动程序 配套的驱动程序是“OLED.c"&#xff0c;主要由以下函数构成&#xff1a;1、初始化&#xff1b;2、清屏&#xff1b;3、显示字符&#xff1b;4、显示字符串&#xff1b;5、显示数字…

计算机毕业设计 基于SpringBoot的高校毕业与学位资格审核系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

LAMP安装部署网站

目录 什么是LAMP? 实验&#xff08;搭建一个论坛&#xff09; 一&#xff0c;安装apache 1.关闭防火墙&#xff0c;将安装Apache所需软件包传到/opt目录下 2.安装环境依赖包 3.配置软件模块 4.编译及安装 5.优化配置文件路径&#xff0c;并把httpd服务的可执行程序文件…

什么是网站劫持

网站劫持是一种网络安全威胁&#xff0c;它通过非法访问或篡改网站的内容来获取机密信息或者破坏计算机系统。如果您遇到了网站劫持问题&#xff0c;建议您立即联系相关的安全机构或者技术支持团队&#xff0c;以获得更专业的帮助和解决方案。

python数据分析之二、读取excel数据并绘制折线图,柱状图、饼状图

今天开始第二篇&#xff0c;也是那位可爱的同学的期末作业 题目基本描述如下&#xff1a;给一个简单的execl表格数据&#xff0c;用并列折线图&#xff0c;并列柱状图和饼图来表现数据。 现给定表格数据如下&#xff1a; 地区人口数0-14岁5-64岁65岁及以上全国14940542613671…

LeetCode124.二叉树中最大路径和

第一次只花了20分钟左右就完全靠自己把一道hard题做出来了。我这个方法还是非常简单非常容易理解的&#xff0c;虽然时间复杂度达到了O(n2)。以下是我的代码&#xff1a; class Solution {int max;public int maxPathSum(TreeNode root) {max Integer.MIN_VALUE;return dfs2(…

船舶机电设备振动数据采集监控系统解决方案

船舶运行中&#xff0c;通常需要通过振动数据采集系统对船舶的各个机电设备运行进行监控&#xff0c;有助于在设备故障时快速预警&#xff0c;进行诊断、分析和维护&#xff0c;保证船舶机电设备正常工作&#xff0c;从而确保工作人员及船舶的安全。 船舶各种机电设备会产生大…

机器连接和工业边缘计算

软件应用和IT创新是制造业投资的主要驱动力。解决方案架构应围绕特定标准进行整合&#xff0c;并采用架构蓝图和最佳实践来满足最终用户的需求。此外&#xff0c;边缘计算&#xff08;Edge Computing&#xff09;也将在制造业中加速部署。 边缘计算是制造业的下一个变革驱动力。…

PyQt基础_011_对话框类控件QMessage

基本功能 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *class WinForm( QWidget): def __init__(self): super(WinForm,self).__init__() self.setWindowTitle("QMessageBox") self.resize(300, 100) self.myButt…

Unity3D实现鼠标悬浮UI或物体上显示文字信息

系列文章目录 Unity工具 文章目录 系列文章目录前言最终效果一、UI事件显示文字1-1 ui事件需要引用命名空间using UnityEngine.EventSystems;1-2 IPointerEnterHandler 接口1-3 IPointerExitHandler 接口1-4 IPointerMoveHandler 接口 二、场景搭建2-1 实现如下 三、代码实现3…

C# 语法笔记

1.ref、out&#xff1a;参数传递的两种方式 ref&#xff1a;引用传递 using System; namespace CalculatorApplication {class NumberManipulator{public void swap(ref int x, ref int y){int temp;temp x; /* 保存 x 的值 */x y; /* 把 y 赋值给 x */y temp; /* 把 t…

Grad-CAM原理

这篇是我对哔哩哔哩up主 霹雳吧啦Wz 的视频的文字版学习笔记 感谢他对知识的分享 只要大家一提到深度学习 缺乏一定的解释性 比如说在我们之前讲的分类网络当中 网络它为什么要这么预测 它针对每个类别所关注的点在哪里呢 在great cam这篇论文当中呢 就完美的解决了在cam这篇论…

Python 数据分析:日期型数据的玩转之道

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在数据分析的领域中&#xff0c;处理日期型数据是至关重要的一环。Python 提供了丰富的工具和库&#xff0c;使得对日期进行分析、处理、可视化变得更加轻松。本文将深入探讨 Python 中如何玩转日期型数据&#…

QMenu风格设计qss+阴影

Qt的菜单经常在软件开发中用到&#xff0c;默认的菜单效果都不符合设计师的要求&#xff0c;本篇介绍QMenu菜单的风格设计&#xff0c;包括样式表和阴影。 1.QMenu样式表的设计 首先看一个默认的菜单 void QGraphicsDropShadowEffectDemo::slotShowDialog() {qDebug() <&l…

Java 简易版 TCP(一对一)聊天

客户端 import java.io.*; import java.net.Socket; import java.util.Date; import javax.swing.*;public class MyClient {private JFrame jf;private JButton jBsend;private JTextArea jTAcontent;private JTextField jText;private JLabel JLcontent;private Date data;p…

数据结构 / 队列 / 循环队列 / 概念

1. 定义 为充分利用向量空间&#xff0c;克服假溢出现象的方法是&#xff1a;将向量空间想象为一个首尾相接的圆环&#xff0c;并称这种向量为循环向量。存储在其中的队列称为循环队列&#xff08;Circular Queue&#xff09;。循环队列是把顺序队列首尾相连&#xff0c;把存储…