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.mzph.cn/news/201310.shtml

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

相关文章

springboot075电影评论网站系统设计与实现

springboot075电影评论网站系统设计与实现 成品项目已经更新&#xff01;同学们可以打开链接查看&#xff01;需要定做的及时联系我&#xff01;专业团队定做&#xff01;全程包售后&#xff01; 2000套项目视频链接&#xff1a;https://pan.baidu.com/s/1N4L3zMQ9nNm8nvEVf…

面试题:公司规定所有接口都用 post 请求,这是为什么?

文章目录 前言get 与 post 的区别所有接口都用 post 请求&#xff1f;网友程墨 Morgan网友苏莉安网友大宽宽 前言 最近在逛知乎的时候发现一个有趣的问题&#xff1a;公司规定所有接口都用 post 请求&#xff0c;这是为什么&#xff1f; 看到这个问题的时候其实我也挺有感触的…

可编程电子负载的应用前景如何

可编程电子负载是一种模拟真实负载的电子设备&#xff0c;它可以模拟各种不同类型和规格的负载&#xff0c;如电阻、电容、电感等。通过可编程的方式&#xff0c;用户可以根据需要灵活地调整负载的大小、电压、电流等参数&#xff0c;以满足不同的测试需求。随着科技的不断发展…

pod容器内无法访问集群外部主机ipv6地址

一、背景 同事反馈他这边有一环境出现pod容器内无法请求集群外部主机ipv6地址&#xff0c;但是在pod所在集群所主机上是可以请求到外部主机ipv6地址。 二、问题处理过程 首先主机和主机之间ipv6地址能通讯&#xff0c;说明主机之间网络是没啥问题&#xff0c;哪问题就出在容器…

微信小程序已经审核通过但是提示订单中心path不通过

设置-基本设置-服务内容声明 更改path重新审核即可

ABCDE类网络的划分及保留网段

根据IP地址的分类&#xff0c;IP地址被分为A、B、C、D和E五类。下面是对ABCDE类网络的划分及保留网段的详细描述&#xff1a; A类网络&#xff1a;范围从1.0.0.0到127.0.0.0&#xff0c;网络地址的最高位必须是“0”&#xff0c;可用的A类网络有127个&#xff0c;每个网络能容…

【算法提升—力扣每日一刷】五日总结【11/30-12/04】

2023/11/30 力扣每日一刷&#xff1a;1.两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元…

TCP协议实现一对一聊天

服务端代码&#xff1a; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner;/*** 发送消息线程*/ class Send e…

linux无法打开M4a格式音频的解决方法

linux是开源系统&#xff0c;之所以打不开&#xff0c;是因为部分linux系统为了避免版权问题&#xff0c;没有m4a的解码插件。所以&#xff0c;解决的办法是安装如下两个非常小的转换器&#xff0c;我们一般用不到转换器的功能&#xff0c;而是反向应用&#xff0c;通过两个几十…

『亚马逊云科技产品测评』活动征文|基于亚马逊EC2云服务器安装Bolo开源博客

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 亚马逊EC2云服务器&#xff08;Elastic Compute Cloud&#xff09;是亚马…

shell脚本实战之mysql-物理备份实现周内备份策略

一.shell脚本要求 # 数据库备份脚本方式: 物理备份# 工具:xtrabackup过程# 需求1:不允许有任何的安在脚本中&#xff0c;# 需求2:在脚本中&#xff0c;不允许有任何的交互式代码容&#xff0c;使用日志记录# 需求3:在脚本中&#xff0c;不允许有任何输出# 需求4:每周为一个循环…

TA-Lib学习研究笔记(九)——Pattern Recognition (6)

TA-Lib学习研究笔记&#xff08;九&#xff09;——Pattern Recognition &#xff08;6&#xff09; 最全面的形态识别的函数的应用&#xff0c;通过使用A股实际的数据&#xff0c;验证形态识别函数&#xff0c;用K线显示出现标志的形态走势&#xff0c;由于入口参数基本上是o…

百度/抖音/小红书/微信搜索品牌形象优化怎么做?

搜索口碑是网络营销不可或缺的一部分&#xff0c;企业如何做好品牌搜索口碑优化呢&#xff1f;小马识途营销顾问建议从以下几方面入手。 1. 通过关键字优化提高自身知名度 通过对竞争对手和目标客户的关键字进行分析&#xff0c;企业可以确定哪些关键字可以提高自身品牌知名度。…

IDEA Maven 配置国内源

基本步骤 分别设置下图的两个&#xff0c;一个是对当前项目的设置&#xff0c;一个是对以后创建的项目设置&#xff0c;这样以后就不用重新配置了。 将下面的两个勾选上 注意&#xff0c;两个地方&#xff0c;Settings 和 Settings for New Projects 的勾都要勾上。 前往 User…

PHP短信接口防刷防轰炸多重解决方案三(可正式使用)

短信接口盗刷轰炸&#xff1a;指的是黑客利用非法手段获取短信接口的访问权限&#xff0c;然后使用该接口发送大量垃圾短信给目标用户 短信验证码轰炸解决方案一(验证码类解决)-CSDN博客 短信验证码轰炸解决方案二(防止海外ip、限制ip、限制手机号次数解决)-CSDN博客 PHP短信…

SQL Sever 基础知识 - 数据筛选(1)

SQL Sever 基础知识 - 四、数据筛选 四、筛选数据第1节 DISTINCT - 去除重复值1.1 SELECT DISTINCT 子句简介1.2 SELECT DISTINCT 示例1.2.1 DISTINCT 一列示例1.2.2 DISTINCT 多列示例 1.2.3 DISTINCT 具有 null 值示例1.2.4 DISTINCT 与 GROUP BY 对比 第2节 WHERE - 过滤查询…

8_企业架构缓存中间件分布式memcached

企业架构缓存中间件分布式memcached 学习目标和内容 1、能够理解描述网站业务访问流程 2、能够理解网站业务的优化方向 3、能够描述内存缓存软件Memcached的作用 4、能够通过命令行操作Memcached 5、能够操作安装php的memcached扩展 extension 6、能够实现session存储到memcach…

mysql数据库(表)误删恢复

mysql数据库(表)误删恢复 1. 检查mysql服务是否开启binlog # 查看是否开启binlog日志 show variables like %log_bin%;看下图结果.如果这里是OFF那就不用看下去了.本文帮助不了 2.开启binlog日志(已开启略过) 1、编辑打开mysql配置文件 ***/my.cnf在 [mysqld]区块添加 l…

第五届CECC中国计算机教育大会召开,文心大模型助力跨学科创新融合

随着科技的飞速发展&#xff0c;大模型已经成为教育、科研等领域的热点话题。12月2日至3日&#xff0c;以“新时代 新计算 新理念”为主题的第五届中国计算机教育大会&#xff08;CECC&#xff09;在厦门召开&#xff0c;百度飞桨和文心大模型承办的“大模型技术创新与教育实践…

婴儿专用洗衣机有必要吗?宝宝洗衣机洗衣服

相信各位宝爸宝妈都有同样的苦恼&#xff0c;那就是宝宝的衣服该怎么来洗宝宝每天都有一大堆衣物和各种巾要洗&#xff0c;如果单纯用手洗&#xff0c;真的是一个很大的工程&#xff0c;将宝宝的衣服丢进去家庭用的洗衣机&#xff0c;宝宝稚嫩的皮肤又怕会被细jun感染到&#x…