1689_MATLAB处理Excel文件提升篇

2023-05-16

全部学习汇总: GreyZhang/g_matlab: MATLAB once used to be my daily tool. After many years when I go back and read my old learning notes I felt maybe I still need it in the future. So, start this repo to keep some of my old learning notes servral years ago. (github.com)

说明:下面所写不代表技术深度,只是个人经验之谈。如有问题,希望路过本文的人能够给我留言或者发邮件跟我交流。如果发现错误也请及时指正,我将十分感激!

Email:greyzhang@126.com   Grey

想说一下我自己MATLAB M语言使用的进展阶段。最初使用的时候只是当做一个超级计算器使用,那是在大学的时候。后来工作中用到文件处理,慢慢就开始变成了脚本。而我理解的脚本含义就是毫无拘束,随便堆砌的一堆命令或者语句组合成的文件。如此一描述就知道它的特点了:写起来简单,因为在语法规则之外几乎是没有限制的;再就是确实是说不上什么结构,更不用谈什么架构。

虽然这个写起来的确是简单,不需要多么强的算法设计功底也不需要多么宽广的知识面,但是说到这种文件的维护那的确是一个噩梦。如果你一直在自己的圈子里那还是很好的,毕竟自己对自己写了一些什么还是很有了解的。但是倘若到了维护别人的脚本的时刻,有时候看了一半自己的决定通常是重写。重写也比修改要来得干脆,来得简单。

然而,说起来这倒不是M语言的缺陷。而是M语言本身优秀的同时又赋予了我们一定的自由度。不幸的是我们很多人让自由泛滥,最终的局面确实是变得有点不可控。我思考过为什么过去我自己工作那么忙,其实很多程度上就是这种方案或者思考的方式采用了拿来主义。不巧的是我的拿来主义所取的对象并不是一个很完美的对象,倘若我取的是某个软件大师的方式,或许现在的我不该是这个样子。而我自己在过去几个月总结出来的晋级方式应该是这样子的:命令à脚本à函数à面向对象。函数能够构建我们思考问题的方式,模块化我们的处理过程。而面向对象确实是能够让我们的东西在很大程度上得到了重用,而这一方面我做的明显不够好。

说的有些远了,谈一下这次晋级的主题——函数化

函数化也能够在一定程度上让我们的代码得到重用,至少是要比脚本好很多。而这种街口化的方式也适合模块化的作战,也能满足多人的协同。在MATLAB中有一点尤其让我觉得函数化很有必要——函数化过程中的变量全都可以理解为局部量或者静态量,也就是说它们不会被引入到数据空间。这样前面的处理过程跟后面的处理过程除了接口之外其他部分互不影响,能够简化调试复杂度,也能够让功能更加稳健。而做到这一切,唯一需要花一点点精力的就是函数的写法。其实,我觉得这比C或者Java简单的多。

函数的定义方式如下:

function [out1, out2, ...] = myfun(in1, in2, ...),其中参数都是可选的。

我觉得有一些通用的函数我们可以只写一次,做成函数以后只是调用就可以了。倘若是写成脚本,这些东西做起来基本上就只能够靠复制粘贴了。下面举个简单的例子,在处理Excel中一般如何使用函数。

下面来完成一个简单的Excel文件格式转换功能,目的是把07版以后的Excel文件转换成03版以及之前的兼容格式。也就是说xlsx扩展名转换成xls扩展名。这当然不是简单改个扩展名就能够实现的,这涉及到文件中的数据格式。我经常使用这个功能,我也用其他的方式实现了这个功能(不用盗版因此工作之余没有这么多的软件可以用,只能是用Perl或者Python等)。不过,MATLAB下实现的确是简单很多,因为写入数据的时候所有的数据转换都是由Excel完成的,而这也是做这个数据转换最稳妥的一个方式。转换成03版之前的版本有个好处,那意味着你将可以使用其他免费软件中的扩展库来处理Excel,那个也会有意思的多。

功能设计将会很简单,把Excel的内容读出来让后再重命名写回到新的文件。一切结束之后,把原来的文件删除。

>> ls

.                  Copy_of_data.xlsx  xlsx2xls.m        

..                 data.xlsx

通过ls命令列出当前目录下的所有文件,其中data.xlsx是将要处理的文件,Copy_of_data.xlsx是备份的文件,xlsx2xls.m是这次写的程序。

程序代码如下:

function xlsx2xls(excel_file)

%   This function can be used to convert a 2007+ version format excel file

%   to a 97-03 version file. You can use this function by passing a excel

%   file name with a string format to it.

%   2015.11.22 First written by Grey.

    new_excel_file  = strrep(excel_file,'.xlsx','.xls');

    [~,sheet_names] = xlsfinfo(excel_file);

    sheet_number    = length(sheet_names);

    for i = 1:sheet_number

        sheet_name     = char(sheet_names(1,i));

        [~,~,raw_data] = xlsread(excel_file,sheet_name);

        xlswrite(new_excel_file,raw_data,sheet_name);

    end

    delete(excel_file);

其中,第一行是函数的原型:此函数有一个传入参数,没有输出参数(正常设计的程序的时候我一般会加入参数,最起码会有处理异常时候的部分“诊断”信息返回)。

程序的第一行是把文件名处理了一下,把xlsx替换成xls获得了一个xls扩展名的文件名。这部分设计实际上有缺陷,因为文件名中本身也可能含有xlsx的字符串。比较好的方式是使用正则表达式,这里仅作演示不做那种复杂化处理。

接下来,先是读取了所有的Sheet页的名字,然后以页的方式向新的文件中写入按页读取的原始数据。

最后一行是对文件源文件的删除,最后只剩下“转换”后的文件。

在命令窗口输入xlsx2xls('data.xlsx');命令,很快处理结束。获得了一个97-03格式的Excel文件。

几点说明:

  1. 这个函数跟脚本就不一样了,你只需要给别人这个接口,以及函数文件别人就可以直接调用你的文件而不必关心你写了什么。更不需要关心你们两个的脚本之间是否有重复的变量名。
  2. 第二行开始的注释最好是写成有关本函数设计的介绍或者函数接口调用方式,这样别人使用这个函数文件时候只要是源代码就能够直接使用help命令查看你的功能介绍。比如,在命令窗口输入help xlsx3xls显示如下结果:

>> help xlsx2xls

    This function can be used to convert a 2007+ version format excel file

    to a 97-03 version file. You can use this function by passing a excel

    file name with a string format to it.

         自己的版本信息等内容可以空一行,以注释的形式写在下面。

  1. 再次说明,这只是一个简单的演示,距离实用还是有很大的改进空间(比如图片,比如格式,比如排版等处理)。
  2. MATLAB在识别函数的时候其实首先识别的是文件名,所以,函数名跟文件名得写成一致。
  3. 这不是脚本,确实是不能直接运行,在调用的时候会实现相应的功能。
  4. 代码中没有任何clear以及clc的命令,但是你会发现数据空间中没有变量运行的痕迹留下。这就是函数化的一大好处的体验,彼此的运行空间似乎是独立的,脚本中的信息也不会受此影响。
  5. 如果考虑到设计较为完美的程序,这里面还需要加入各种异常的处理。这是我学习Python的时候学到的一种编程哲学,我觉得确实是很有必要。我们考虑的设计,不应该局限于当前,确实是应该扩展眼界看到很久以后。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

1689_MATLAB处理Excel文件提升篇 的相关文章

  • 如何计算 COUNTIF 但仅计算唯一值?

    我有一个数据集 其中有一列包含参考文献 参考文献始终遵循相同的格式 1 XXX YYY XXX 始终为 3 个字母 YYY 始终是一个数字 每个XXX都会有YYY 001 如果同一个XXX有多个类型 就会有YYY 002 以此类推 我想知道
  • 你将如何开始自动化我的工作? - 第2部分

    后续这个问题 https stackoverflow com questions 2796128 how would you start automating my job 在经历了第一波进货 9 小时的复制 粘贴 后 我现在相信我已经满足
  • 实体框架、dll、excel

    我用C 编写了Excel使用的dll 该dll是COM注册的 我与 Excel 的连接没有问题 该 dll 使用实体框架 5 从 SQL Server 数据库检索数据 如果我通过控制台应用程序运行该 dll 则该 dll 工作正常 但是当我
  • 直方图均衡结果

    I am trying to code histogram equalization by my self but the results are different from the built in function in matlab
  • 由于直接引用范围而不是通过中间变量而导致 Excel VBA 运行时错误 450

    当我尝试直接引用某个范围内的值时 出现运行时错误 450 但如果我使用中间变量 它就会起作用 我不明白为什么 所以我担心在将来的某个时候我会再次遇到错误而不知道为什么 我尝试过使用 With End With 块 但当我直接引用范围时它仍然
  • 选择在 Excel 宏(VBA 中的范围对象)中具有值的列

    如何修改 VBA 中的这一行以仅选择具有值的列 Set rng Range A1 Range A65536 End xlUp SpecialCells xlCellTypeVisible 我不认为我做的事情是正确的CountLarge财产是
  • 使用 VBA 通过简单命令从非连续范围的并集获取值到数组中(无循环)

    我有以下任务 表面上很简单 使用 VBA 将电子表格上多个列的值复制到二维数组中 为了让生活更有趣 这些柱子并不相邻 但它们的长度都相同 显然 可以通过依次循环每个元素来做到这一点 但这看起来非常不优雅 我希望有一个更紧凑的解决方案 但我很
  • 如何在向量中的所有点之间绘制线?

    我有一个包含二维空间中一些点的向量 我希望 MATLAB 用从每个点到每个其他点绘制的线来绘制这些点 基本上 我想要一个所有顶点都连接的图 你能用情节来做到这一点吗 如果可以 怎么做 一种解决方案是使用该函数为每个点组合创建一组索引MESH
  • 如何使用 VBA 将 mm/dd/yyyy 更改为 dd/mm/yyyy

    我在使用 VBA 将 mm dd yyyy 转换为 dd mm yyyy 日期格式时遇到问题 我有一个这样的表 仅供参考 该表是从报告工具自动生成的 字符串操作 或任何 Excel 函数可以提供帮助吗 希望知道如何解决这个问题的人可以给我一
  • laravel中过滤后如何导出excel?

    我想仅导出视图刀片中过滤的数据 我正在使用 Laravel 7 和 maatwebsite excel 3 1 和 PHP 7 4 2 我浏览了文档并应用了这个 View a href class btn btn success i cla
  • Matlab 图像数据的 hist 函数

    我是 Matlab 新手 我想制作自己的函数 与 imhist 显示图像数据的直方图 完成相同的工作 但我对此完全是新手 我不知道如何做开发这样的功能 我开始做一些东西 但它非常不完整 function output args myhist
  • 如何正确从表中删除 NaN 值

    在 Matlab 中阅读 Excel 电子表格后 不幸的是 我的结果表中包含了 NaN 例如这个 Excel 表格 将产生此表 其中出现额外的 NaN 列 我尝试使用以下代码片段删除 NaN measurementCells readtab
  • 我可以用文本框设置变量名称吗? excel

    我可以使用 TextBox Vba Excel 设置变量的名称吗 我必须以在文本框中写入组名称并单击命令按钮的方式输入新的产品组 代码必须从文本框中获取字符串 并将该字符串设置为新创建的数组的名称 我只想在运行时创建一个新变量 或数组 据信
  • 命令 A(~A) 在 matlab 中的真正作用是什么

    我一直在寻找找到矩阵非零最小值的最有效方法 并在论坛上找到了这个 设数据为矩阵A A A nan minNonZero min A 这是非常短且高效的 至少在代码行数方面 但我不明白当我们这样做时会发生什么 我找不到任何关于此的文档 因为它
  • 使用 Apache POI Excel 写入特定单元格位置

    如果我有一个未排序的参数 x y z 列表 是否有一种简单的方法将它们写入使用 POI 创建的 Excel 文档中的特定单元格 就好像前两个参数是 X 和Y 坐标 例如 我有如下行 10 4 100 是否可以在第 10 行第 4 列的单元格
  • 根据单元格值向用户窗体添加复选框

    我对 VBA 很陌生 只有 3 天 但我发现它非常有用且易于使用 但现在我面临一个问题 我需要制作一个具有不同复选框的用户窗体 但我需要根据工作表某一列中使用的信息自动添加它们 我相信我可以使用 For Each Next 但我真的不知道如
  • 以 2 为底的矩阵对数

    Logm 取矩阵对数 并且log2 取矩阵每个元素以 2 为底的对数 我正在尝试计算冯 诺依曼熵 它涉及以 2 为底的矩阵对数 我该怎么做呢 如果将 以 2 为底 的矩阵指数定义为B expm log 2 A 或者如果您类似地通过特征分解直
  • 如何使用VBA根据条件删除Excel中的行?

    我目前正在构建一个宏来格式化数据表并删除不适用的数据行 具体来说 我希望删除列 L ABC 的行以及删除列 AA DEF 的行 到目前为止 我已经实现了第一个目标 但还没有实现第二个目标 现有代码是 Dim LastRow As Integ
  • 在组合框中显示可见工作表

    您好 我有以下代码来在组合框中显示工作表 创建工作表后 工作表会自动添加到列表中 我不希望隐藏的工作表在保管箱中可见 我怎么做 Option Explicit Private Sub ComboBox1 Change If ComboBox
  • 文件夹.文件的相对路径

    我有一个 Excel 文件 在同一文件夹中还有一个包含我想要包含的 CSV 文件的文件夹 使用 来自文件夹 查询 第一步将给出以下查询 Folder Files D OneDrive Documents Health Concept2 现在

随机推荐

  • 岁月静好

    不是说马年会马上转运的 xff0c 是不是蛇年的时候前半年太幸福了 xff0c 用了太多的好人品 xff0c 各种奖学金 xff0c 各种申请中标 xff0c 各种荣誉 xff0c 然后我要还了 小猴子说我开始会依赖人了 xff0c 哈哈
  • STM32 中重定向printf 和 scanf

    uart c 如果使用 pragma import use no semihosting 则在MDK中不勾选use Microlib 当前代码直接重定向没使用 pragma import use no semihosting 故需要选择us
  • Ubuntu环境下Pixhawk原生固件PX4的编译

    Ubuntu下Pixhawk原生固件PX4的编译这个问题困扰了两天时间 xff0c 可能是博主脑力不够 xff0c 主要是环境搭建不起来 xff0c 主要原因应该是路径的原因 xff0c 最后在大师傅的帮助下还好成功将路径搭建好 xff0c
  • 远程连接虚拟机的Network error: Connection timed out问题

    MobaXterm远程连接虚拟机的Network error Connection timed out问题 我使用的是MobaXterm远程连接我使用VMware创建的虚拟机 更新一下 xff1a 如果出现这种问题 xff0c 极大可能是服
  • springboot项目接入天猫精灵

    springboot项目接入天猫精灵 最近工作需要使用到天猫精灵的语音功能 xff0c 大体是通过呼叫对应的 调用词 实现携带参数 xff0c 然后调用我项目中的接口 xff0c 以实现对应的业务 所以在此简单的记录下使用过程 实际上 xf
  • Lesson 9.2&9.3&9.4 黑箱:不可解释的深层神经网络&探索多层神经网络:层vsh(z)

    二 黑箱 xff1a 深层神经网络的不可解释性 首先从结构上来看 xff0c 多层神经网络比单层神经网络多出了 中间层 中间层常常被称为隐藏层 xff08 hidden layer xff09 xff0c 理论上来说可以有无限层 xff0c
  • UnicodeEncodeError: 'gbk' codec can't encode character ...

    使用Python写文件的时候 xff0c 或者将网络数据流写入到本地文件的时候 xff0c 大部分情况下会遇到 xff1a UnicodeEncodeError 39 gbk 39 codec can 39 t encode charact
  • 一文简单了解并构建DockerFile

    GreatSQL社区原创内容未经授权不得随意使用 xff0c 转载请联系小编并注明来源 GreatSQL是MySQL的国产分支版本 xff0c 使用上与MySQL一致 作者 xff1a 蟹黄瓜子文章来源 xff1a GreatSQL社区投稿
  • 头文件中定义和声明的问题

    头文件中定义和声明的问题 1 头文件中不可以放变量的定义 xff01 一般头文件中只是放变量的声明 xff0c 因为头文件要被其他文件包含 include xff0c 如果把定义放在头文件的话 xff0c 就不能避免多次定义变量 C 43
  • Apache中更改PHP版本型号

    如何对服务器PHP版本进行升级 xff0c 详看我另外一篇博文 xff0c 这篇文章我们将讲述如何在Apache中更改PHP版本型号 Step1 xff1a 查看Apache用的PHP什么版本 新建一个文档 xff0c 命名为info ph
  • 简述AGV通信接口标准-VDA5050

    引言 德国汽车工业协会 德语 xff1a Verband der Automobilindustrie e V 简称VDA xff0c 通过 其 34 VDA 5050 34 接口 xff0c 早在2019年起 xff0c 不同制造商的车辆
  • C语言结束输入(两种方法)

    方法1 xff1a 输入数据 while getchar 61 39 n 39 scanf 34 d 34 amp Data data i 43 43 61 Data 方法2 xff1a for i 61 0 i lt 100 amp am
  • OpenCV(项目)车牌识别3 -- 模板匹配

    目录 一 基础理论 1 思想 2 大致过程 二 详细过程 1 首先需要模板库 2 得到模板 3 原图限定大小 4 模板匹配 5 匹配所有子文件夹 xff0c 保存最佳得分 xff08 最匹配项 xff09 三 大致过程 xff08 细分类
  • PMP项目管理中的重要角色

    PMP及PMBOK有个大问题 xff0c 就是没有统一的角色职责及流程 xff0c 考试也是随意性很强 xff0c 这给考生带来很多困扰 一个管理体系 xff0c 首先是人员分工安排 比如 xff1a PRINCE2 xff0c 明确的组织
  • 书房再次升级啦~~

    国庆长假 xff0c 在家里面一顿折腾 xff0c 墙全部重新粉刷 xff0c 书房 卧室 客厅三种不同颜色 书房的颜色是当时在装饰城的展厅里面偷偷扣的墙皮 xff0c 在多乐士店色卡里面对出来的 xff0c 哈哈 ps 这篇日志的照片是用
  • 基于K近邻法的手写数字图像识别

    数字图像处理课程论文 题目 xff1a 数字图像识别 摘要 模式识别 PatternRecognition 是一项借助计算机 xff0c 就人类对外部世界某一特定环境中的客体 过程和现象的识别功能 xff08 包括视觉 听觉 触觉 判断等
  • Ubuntu 16.04升级内核到20.04

    一 首先需要从16 04 18 04 sudo mv etc apt sources list sudo mv etc apt sources list d list 1 改变源 xff08 粘贴下面这一段到终端并运行 xff09 cat
  • 互斥和二进制信号量的使用

    1 二进制信号量 semBCreate SEM Q FIFO SEM Q PRIORITY SEM EMPTY SEM FULL 有两个作用 xff1a xff08 1 xff09 任务间的互斥 xff0d xff0d 同一个任务获取和释放
  • 【C++】关于以下划线开头的变量名

    系 统头文件里将宏名 变量名 内部函数名用 34 34 开 头就是为了避免与用户用的名字冲突 因为当你 xff03 include 系 统头文件时 xff0c 这些文件里的名字都有了定义 xff0c 如果与你用的名字冲突 xff0c 就可能
  • 1689_MATLAB处理Excel文件提升篇

    全部学习汇总 xff1a GreyZhang g matlab MATLAB once used to be my daily tool After many years when I go back and read my old lea