Matlab之文件读写操作【CSV/Excel/JSON/XML/TXT】

⛄前言

CSVComma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。CSV文件通常以 .csv 作为文件扩展名。

XLS就是Microsoft Excel工作表,是一种非常常用的电子表格格式。xls文件可以使用Microsoft Excel打开,另外微软为那些没有安装Excel的用户开发了专门的查看器Excel Viewer。使用Microsoft Excel可以将XLS格式的表格转换为多种格式:XML表格、XML数据、网页、使用制表符分割的文本文件(.txt)、使用逗号分隔的文本文件(.csv)等。

XLSXMicrosoft Office EXCEL 2007/.../2019文档及以上的扩展名。其基于Office Open XML标准的压缩文件格式取代以前专有的默认文件格式,在传统文件名扩展名后面添加字母"x"(即.docx取代.doc.xlsx取代.xls.pptx取代.ppt)。任何能够打开.xlsx文件的文字处理软件都可以将该文档转换为.xls文件,.xlsx文件比.xls文件所占用空间更小。

xlsx格式文档文件无法被EXCEL2003及以下版本EXCEL软件直接打开编辑,安装OFFICE2007兼容包后可以打开查看。手动将XLSX文件后缀修改为XLS无法改变文档文件的本质属性,是不能被EXCEL2003等低版本EXCEL直接打开编辑的。用户可在EXCEL软件成功打开EXCEL2007专有XLSX格式文档的前提下,采用另存为方式将其转换为EXCEL97—2003格式文档的XLS文件这样可与旧的版本兼容,但一些EXCEL2007文档专有的特性格式可能丢失。Excel xlsxlsx的详细区别如下:

  • 文件格式不同xls是一个特有的二进制格式,其核心结构是复合文档类型的结构,而xlsx的核心结构是XML类型的结构,采用的是基于XML的压缩方式,使其占用的空间更小。xlsx中最后一个x的意义就在于此。
  • 版本不同xlsexcel2003及以前版本生成的文件格式,不管有没有宏程序的话都是xls文件,而xlsxexcel2007及以后版本生成的文件格式,从2007开始做了区分,XLSM文件和XLSX文件都是excel2007及其以后的文件,但前者是含有宏启用,Excel中默认情况下不自动启用宏,默认是XLSXVBA中,如果不想保存代码,可以保存为xlsx,即可自动删除其中VBA代码,反之则保存为XLSM文件。
  • 兼容性不同xlsx格式是向下兼容的,可兼容xls格式。07版的Office Excel,能打开编辑07版(后缀.xlsx)的Excel文件,也能打开编辑03版(后缀.xls)的Excel文件,都不会出现乱码或者卡死的情况。03版的Office Excel,就只能打开编辑03版(后缀.xls)的Excel文件;如果打开编辑07版(后缀.xlsx)的Excel文件,则可能出现乱码或者开始能操作到最后就卡死,以后一打开就卡死。
  • 默认保存方式上xls是03版Microsoft Office Excel 工作表的格式,用03版Office,新建Excel默认保存的Excel文件格式的后缀是.xlsxlsx是07版Microsoft Office Excel 工作表的格式,用07版Office,新建Excel默认保存的的Excel文件格式后缀是.xlsx
  • 容量不同xls只有65536行、256列;xlsx可以有1048576行、16384列

JSONJavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。它基于 ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

XML (Extensible Markup Language, 可扩展标记语言) ,标准通用标记语言的子集,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言可扩展性良好,内容与形式分离,遵循严格的语法要求,保值性良好等优点。

TXT文件是微软在操作系统上附带的一种文本格式,是最常见的一种文件格式,早在DOS时代应用就很多,主要存储文本信息,即为文字信息,现在的操作系统大多使用记事本等程序保存,大多数软件可以查看,如记事本,浏览器等等。

⛄Matlab之读写文件

使用过程中注意MATLAB版本差异问题。

MATLAB每一条语句后加分号与否的区别:

  • 代码后加分号,运行结果不会显示在命令窗口;

  • 代码后不加分号,当点击回车时,运行结果会立即在命令窗口(window command)显示。

👀CSV

(1)csvread()(不推荐)

CSV文件源数据:

name,gender,age,语文,数学,英语
小红,女,20,130,140,135
小汤,男,22,131,141,136
小李,男,24,132,142,137
小ai,男,21,133,143,138
小张,男,25,134,144,139
小小,男,20,135,145,140
小耿,男,25,136,146,141

利用csvread读取CSV文件

% 读取逗号分隔值格式的文件名,结果直接返回给result,CSV文件只能包含数值。
result = csvread("filename")
% 从CSV文件中读取数据(从R行和C列开始)
result = csvread("filename", R, C)
% 只读取由range=[R1 C1 R2 C2]指定的范围,其中(R1,C1)是要读取数据的左上角,(R2,C2)是右下角。也可以使用电子表格表示法指定RNG,如range="A1..B7",而非[0 0 6 1]。
result = csvread("filename",R1,C1,[R1 C1 R2 C2])

MATLAB代码:CTRL+R(注释)、CTRL+T(取消注释)

clc
clear all
result1 = csvread('D:\Desktop\data1.csv', 1, 2)
result2 = csvread('D:\Desktop\data1.csv', 1, 2, [1 2 6 4])
result3 = csvread('D:\Desktop\data1.csv', 1, 2, "C2..F8")

% 命令行窗口输出
result1 =
    20   130   140   135
    22   131   141   136
    24   132   142   137
    21   133   143   138
    25   134   144   139
    20   135   145   140
    25   136   146   141
result2 =
    20   130   140
    22   131   141
    24   132   142
    21   133   143
    25   134   144
    20   135   145
result3 =
    20   130   140   135
    22   131   141   136
    24   132   142   137
    21   133   143   138
    25   134   144   139
    20   135   145   140
    25   136   146   141

MATLAB帮助中心已经不推荐使用 csvread,请改用 readmatrix

(2)readmatrix()

参数详解见MATLAB帮助中心。

  • 从文本文件中读取矩阵
  • 从电子表格文件中读取矩阵
  • 使用导入选项从指定的工作表和范围中读取矩阵
  • 从指定的工作表和范围中读取矩阵
% (1)通过从文件中读取列向数据来创建数组,readmatrix函数可自动检测文件的导入参数。
% readmatrix基于文件的扩展名确定文件格式:
% .txt、.dat或.csv(带分隔符的文本文件)
% .xls、.xlsb、.xlsm、.xlsx、.xltm、.xltx或.ods(电子表格文件)
% 对于包含数值和文本混合数据的文件,默认情况下,readmatrix将数据作为数值数组导入。
result = readmatrix(filename)
% (2)还使用导入选项opts
result = readmatrix(filename,opts)
% (3)基于文件创建一个数组,并通过一个或多个名称-值对组参数指定其他选项。需要在输入参数之后指定名称-值对组。
% 要为数据设置特定的导入选项,您可以使用opts对象,也可以指定名称-值对组。当您指定除opts之外的名称-值对组时,readmatrix仅支持下列名称-值对组:
% 文本文件:DateLocale、Encoding
% 电子表格文件:Sheet、UseExcel
A = readmatrix(___,Name,Value)

利用readmatrix()读取CSV文件:

clc
clear all
% readmatrix第一个参数是文件名。第二个参数指输出类型。如果不带这个参数,那字符串那一列的输出结果是Nan值
% 加上之后,则全部输出文本类型,后面再把要作为数值型的内容转换数据类型。
result4 = readmatrix('D:\Desktop\data1.csv')
result5 = readmatrix('D:\Desktop\data1.csv', 'OutputType', 'string')

% 命令行窗口输出
result4 =
   NaN   NaN    20   130   140   135
   NaN     7    22   131   141   136
   NaN     7    24   132   142   137
   NaN     7    21   133   143   138
   NaN     7    25   134   144   139
   NaN     7    20   135   145   140
   NaN     7    25   136   146   141
result5 = 
  7×6 string 数组
    "小红"    "女"    "20"    "130"    "140"    "135"
    "小汤"    "男"    "22"    "131"    "141"    "136"
    "小李"    "男"    "24"    "132"    "142"    "137"
    "小ai"    "男"    "21"    "133"    "143"    "138"
    "小张"    "男"    "25"    "134"    "144"    "139"
    "小小"    "男"    "20"    "135"    "145"    "140"
    "小耿"    "男"    "25"    "136"    "146"    "141"
(3)importdata()
% (1)将数据加载到数组A中
A = importdata(filename)
% (2)从系统剪贴板而不是文件加载数据。
A = importdata('-pastespecial')
% (3)将delimiterIn解释为ASCII文件filename或剪贴板数据中的列分隔符。您可以将delimiterIn与以上语法中的任何输入参数结合使用。
A = importdata(___,delimiterIn)
% (4)从ASCII文件filename或剪贴板加载数据,并读取从第headerlinesIn+1 开始的数值数据。
A = importdata(___,delimiterIn,headerlinesIn)
% (5)支持上述语法中的任何输入参数,并在delimiterOut中额外返回检测到的输入ASCII文件中的分隔符,以及在headerlinesOut中返回检测到的标题行数。
[A,delimiterOut,headerlinesOut] = importdata(___)
clc
clear all
% 返回一个struct类型,默认将文本与数值分开
% 此方法虽然简便,但是貌似对数据量过大的数据不太友好
% matlab实现输出的几种方式(disp函数、fprintf函数、print函数)
result6 = importdata('D:\Desktop\data1.csv')
disp(result6)
data = result6.data
textdata = result6.textdata

% 命令行窗口输出
        data: [7×4 double]
    textdata: {8×6 cell}
data =
    20   130   140   135
    22   131   141   136
    24   132   142   137
    21   133   143   138
    25   134   144   139
    20   135   145   140
    25   136   146   141
textdata =
  8×6 cell 数组
    {'name'}    {'gender'}    {'age'   }    {'语文'  }    {'数学'  }    {'英语'  }
    {'小红'}    {'女'    }    {0×0 char}    {0×0 char}    {0×0 char}    {0×0 char}
    {'小汤'}    {'男'    }    {0×0 char}    {0×0 char}    {0×0 char}    {0×0 char}
    {'小李'}    {'男'    }    {0×0 char}    {0×0 char}    {0×0 char}    {0×0 char}
    {'小ai'}    {'男'    }    {0×0 char}    {0×0 char}    {0×0 char}    {0×0 char}
    {'小张'}    {'男'    }    {0×0 char}    {0×0 char}    {0×0 char}    {0×0 char}
    {'小小'}    {'男'    }    {0×0 char}    {0×0 char}    {0×0 char}    {0×0 char}
    {'小耿'}    {'男'    }    {0×0 char}    {0×0 char}    {0×0 char}    {0×0 char}
(4)readtable()

参数详解见MATLAB帮助中心。

  • 基于文本文件创建表
  • 忽略标题并填充缺失值
  • 基于文本文件创建表,无列标题
  • 基于文本文件创建格式表
  • 从文本文件读取外语日期
  • 基于包含行名称的电子表格创建表
  • 从电子表格中读取特定范围的数据
  • 检测并使用针对文本文件的导入选项
  • 检测并使用针对电子表格文件的导入选项
  • 读取包含任意变量名称的表格数据
  • 从文件中读取十六进制和二进制数字
  • XML文件创建XML导入选项
  • 注册自定义XML命名空间前缀
  • Microsoft Word文档中读取特定表
  • HTML网页读取表
% (1)通过从文件中读取列向数据来创建表。
% readtable基于文件的扩展名确定文件格式:
% .txt、.dat或.csv(带分隔符的文本文件)
% .xls、.xlsb、.xlsm、.xlsx、.xltm、.xltx或.ods(电子表格文件)
% .xml(可扩展标记语言(XML)文件)
% .docx(Microsoft® Word文档文件)
% .html、.xhtml或.htm(超文本标记语言(HTML)文件)
% 对于文本和电子表格文件,readtable为该文件中的每列在T中创建一个变量并从文件的第一行中读取变量名称。对于XML文件,readtable在T中为检测为表变量的每个元素或属性节点创建一个变量。变量名称对应于元素和属性名称。对于 Microsoft Word文档文件,默认情况下readtable从文档中的第一个表导入数据,为该文件中的每列在T中创建一个变量并从该表的第一行中读取变量名称。对于HTML文件,默认情况下readtable从第一个<TABLE>元素导入数据,为该文件中的每列在T中创建一个变量并从该表的第一行中读取变量名称。
% 默认情况下,readtable会根据在输入文件的每列中检测到的数据值来创建具有适当数据类型的变量。
T = readtable(filename)
% (2)使用导入选项opts创建表。
T = readtable(filename,opts)
% (3)基于文件创建一个表,并通过一个或多个名称-值对组参数指定其他选项。例如,您可以指定readtable是将文件的第一行读取为变量名称还是数据。
% 要为数据设置特定的导入选项,您可以使用opts对象,也可以指定名称-值对组。当您指定除opts之外的名称-值对组时,readtable仅支持下列名称-值对组:
% 文本和电子表格参数 -ReadVariableNames、ReadRowNames
% 仅文本参数 -DateLocale、Encoding
% 仅电子表格参数 -Sheet、UseExcel
T = readtable(___,Name,Value)
clc
clear all
result7 = readtable('D:\Desktop\data1.csv')

% 命令行窗口输出
result7 =
  7×6 table
     name     gender    age    x__    x___1    x___2
    ______    ______    ___    ___    _____    _____

    '小红'     '女'      20     130     140      135 
    '小汤'     '男'      22     131     141      136 
    '小李'     '男'      24     132     142      137 
    '小ai'     '男'     21     133     143      138 
    '小张'     '男'      25     134     144      139 
    '小小'     '男'      20     135     145      140 
    '小耿'     '男'      25     136     146      141 
(5)csvwrite()(不推荐)
% 可查看帮助中心函数说明
% 将矩阵M以逗号分隔值形式写入文件filename。
csvwrite(filename,M)
% 从指定的行和列偏移量开始将矩阵M写入文件filename。行和列参数从0开始,因此row=0和col=0指定文件中的第一个值。
csvwrite(filename,M,row,col)
  • 对于字符串类型csvwrite可能不支持;
  • 帮助中心:不推荐使用csvwrite,请改用writematrix
clc
clear all

csv_data = importdata('D:\Desktop\data1.csv')
data = csv_data.data;
textdata = csv_data.textdata;
csvwrite('D:\Desktop\output.csv',data, 0, 0)
% 输出结果为double
res1 = readmatrix('D:\Desktop\output.csv')
% 输出结果为string
res2 = readmatrix('D:\Desktop\output.csv', 'OutputType', 'string')

% 命令行窗口输出结果
csv_data = 
  包含以下字段的 struct:
        data: [7×4 double]
    textdata: {8×6 cell}
res1 =
    20   130   140   135
    22   131   141   136
    24   132   142   137
    21   133   143   138
    25   134   144   139
    20   135   145   140
    25   136   146   141
res2 = 
  7×4 string 数组
    "20"    "130"    "140"    "135"
    "22"    "131"    "141"    "136"
    "24"    "132"    "142"    "137"
    "21"    "133"    "143"    "138"
    "25"    "134"    "144"    "139"
    "20"    "135"    "145"    "140"
    "25"    "136"    "146"    "141"
(6)writematrix()

参数详解见MATLAB帮助中心。

  • 将矩阵写入到文本文件
  • 将矩阵写入电子表格文件
  • 将矩阵写入指定的工作表和范围
  • 将数据追加到电子表格
  • 将矩阵数据追加到文本文件
% writematrix()将矩阵写入文件,自R2019a起
% (1)将同构数组A写入以逗号分隔的文本文件。文件名为数组的工作区变量名称,附加扩展名.txt。如果writematrix无法根据数组名称构造文件名,那么它会写入matrix.txt文件中。A中每个变量的每一列都将成为输出文件中的列。writematrix函数会覆盖任何现有文件。
writematrix(A)
% (2)写入具有filename指定的名称和扩展名的文件。
% writematrix 根据指定扩展名确定文件格式。扩展名必须是下列格式之一:
% .txt、.dat或.csv(带分隔符的文本文件)
% .xls、.xlsm或.xlsx(适用于Excel® 电子表格文件)
% .xlsb(适用于安装了Windows® Excel的系统上支持的Excel电子表格文件)
writematrix(A,filename)
% (3)支持上述语法中的任何输入参数,且可使用一个或多个Name,Value对组参数指定其他选项将数组写入文件中。
writematrix(___,Name,Value)
clc
clear all

csv_data = readmatrix('D:\Desktop\data1.csv', 'OutputType', 'string')
% 没有标题,可以根据自己创建的矩阵添加标题
writematrix(csv_data,'D:\Desktop\output1.csv')

% 命令行窗口输出结果
csv_data = 
  7×6 string 数组
    "小红"    "女"    "20"    "130"    "140"    "135"
    "小汤"    "男"    "22"    "131"    "141"    "136"
    "小李"    "男"    "24"    "132"    "142"    "137"
    "小ai"    "男"    "21"    "133"    "143"    "138"
    "小张"    "男"    "25"    "134"    "144"    "139"
    "小小"    "男"    "20"    "135"    "145"    "140"
    "小耿"    "男"    "25"    "136"    "146"    "141"
(7)dlmwrite()(不推荐)

帮助中心:不推荐使用dlmwrite,请改用writematrix

dlmwrite支持数值数据,不支持字符串类型。具体参数解释可以查看MATLAB帮助中心文档。

% (1)将数组M中的数值数据写入一个ASCII格式的文件filename,并使用默认分隔符(,)分隔各数组元素。如果文件filename已存在,则dlmwrite将覆盖该文件。
dlmwrite(filename,M)
% (2)将数据追加到现有文件filename的末尾。
dlmwrite(filename,M,'-append')
% (3)使用一个或多个名称-值对组参数另外指定分隔符、换行符、偏移量和精度选项。
dlmwrite(___,Name,Value)
% (4)将数组M写入文件filename,并使用指定分隔符delimiter分隔各数组元素。
dlmwrite(filename,M,delimiter)
% (5)从目标文件中指定的第row行和第col列开始写入数组。前导行和列用delimiter分隔的空元素填充。
dlmwrite(filename,M,delimiter,row,col)
clc
clear all

% 支持数值型
csv_data = importdata('D:\Desktop\data1.csv')
data = csv_data.data
% 添加到csv中,并且以逗号为分隔符
dlmwrite('D:\Desktop\output2.csv',data,'delimiter',',')
% 添加到csv中,并且从行后添加
dlmwrite('D:\Desktop\output2.csv',data,'delimiter',',','-append')
% 添加到csv中,并且以相对于已有数据偏移的方式
dlmwrite('D:\Desktop\output2.csv',data,'delimiter',',','-append','roffset',2,'coffset',2)

% 命令行窗口输出结果
csv_data = 
  包含以下字段的 struct:
        data: [7×4 double]
    textdata: {8×6 cell}
data =
    20   130   140   135
    22   131   141   136
    24   132   142   137
    21   133   143   138
    25   134   144   139
    20   135   145   140
    25   136   146   141
(8)writetable()

参数详解见MATLAB帮助中心。也可实现:

  • 将表写入到文本文件
  • 将表写入空格分隔的文本文件
  • 将表写入包含行名称的文本文件
  • 将外语日期写入文本文件
  • 将外语字符写入文本文件
  • 将引用文本写入**CSV文件**
  • 将表写入到电子表格中特定的工作表和范围
  • 写入包含任意变量名称的表格数据
  • 将数据追加到表的底部
  • 保留现有列宽(将数据追加到文件底部时,保留电子表格文件的现有列宽)
  • 修改现有单元格格式
  • 将表写入**XML文件**
% (1)将表T写入逗号分隔的文本文件。文件名为表的工作区变量名称,附加扩展名.txt。如果writetable无法根据输入表名称构造文件名,那么它会写入table.txt 文件中。
% 对于文本文件和电子表格文件,T中每个变量的每列都成为输出文件中的一列。T的变量名称将成为文件第一行的列标题。
% 对于XML文件,T中的每列都成为输出文件中的一个XML节点。T的变量名称成为输出XML文件中元素节点的名称。
writetable(T)
% (2)写入具有filename指定的名称和扩展名的文件。
% writetable根据指定扩展名确定文件格式。扩展名必须是下列格式之一:
% .txt、.dat或.csv(带分隔符的文本文件)
% .xls、.xlsm或.xlsx(适用于Excel®电子表格文件)
% .xlsb(适用于安装了Windows® Excel的系统上支持的Excel电子表格文件)
% .xml(可扩展标记语言(XML)文件)
writetable(T,filename)
% (3)通过一个或多个Name,Value对组参数指定的其他选项将表写入文件中,并且可以包含以前语法中的任何输入参数。例如,您可以指定是否将变量名称写入为输出文件中的列标题。
writetable(___,Name,Value)
clc
clear all

LastName = {'Sanchez';'Johnson';'Li';'Diaz';'Brown'}
Age = [38;43;38;40;49]
Smoker = logical([1;0;1;0;1])
Height = [71;69;64;67;64]
Weight = [176;163;131;133;119]
BloodPressure = [124 93; 109 77; 125 83; 117 75; 122 80]
table_csv = table(LastName,Age,Smoker,Height,Weight,BloodPressure)
% 自定义列索引和行索引
table_csv.Properties.VariableNames = {'a','b','c','d','e','f'}
table_csv.Properties.RowNames = {'g','h','i','j','k'}
writetable(table_csv,"D:\Desktop\output3.csv")

👀Excel

函数详解见上,或者MATLAB帮助中心。

读取全部内容读取特定部分内容追加内容

(1)xlsread()(不推荐)
  • 将工作表读取到数值矩阵
  • 读取元胞的范围
  • 读取列
  • 请求数值、文本和原始数据
  • 对工作表执行函数
  • 请求自定义输出
% (1)读取名为filename的 Microsoft®Excel®电子表格工作表中的第一个工作表,并在一个矩阵中返回数值数据。
num = xlsread(filename)
% (2)读取指定的工作表。
num = xlsread(filename,sheet)
% (3)从工作簿的第一个工作表的指定范围内读取数据。使用Excel范围语法,例如'A1:C3'。
num = xlsread(filename,xlRange)
% (4)读取指定的工作表和范围。
num = xlsread(filename,sheet,xlRange)
% (5)在basic导入模式下读取电子表格中的数据。如果您的计算机未安装Windows®版 Excel或者您正在使用MATLAB®Online™,xlsread会自动在basic导入模式下运行,该模式支持XLS、XLSX、XLSM、XLTX和XLTM文件。
% 如果不指定所有参数,请使用空字符向量''作为占位符,例如,num=xlsread(filename,'','','basic')。
num = xlsread(filename,sheet,xlRange,'basic')
% (6)支持上述语法中的任何输入参数,且可在元胞数组txt中返回文本字段,在元胞数组raw中返回数值数据和文本数据。
[num,txt,raw] = xlsread(___)
% (7)打开一个Excel窗口以便按交互方式来选择数据。选择工作表,将鼠标拖放到所需范围上,然后点击确定。只有安装了Microsoft Excel软件的Windows计算机才支持此语法。
___ = xlsread(filename,-1)
% (8)读取电子表格,对数据调用processFcn,并在数组num中以数值数据的形式返回最终结果。xlsread函数在元胞数组txt中返回文本字段、在元胞数组raw中返回数值和文本数据,并在数组custom中返回processFcn的第二个输出。xlsread函数不会更改电子表格中存储的数据。只有安装了Excel软件的Windows计算机才支持此语法。
% (其中processFcn是函数句柄)
[num,txt,raw,custom] = xlsread(filename,sheet,xlRange,'',processFcn)
clc
clear all

values = {1, 2, 3 ; 4, 5, 'x' ; 7, 8, 9}
headers = {'First','Second','Third'}
xlswrite('D:\Desktop\myExample.xlsx',[headers; values])
filename = 'D:\Desktop\myExample.xlsx'
data = xlsread(filename)

% 命令行窗口输出结果
values =
  3×3 cell 数组
    {[1]}    {[2]}    {[3]}
    {[4]}    {[5]}    {'x'}
    {[7]}    {[8]}    {[9]}
headers =
  1×3 cell 数组
    {'First'}    {'Second'}    {'Third'}
data =
     1     2     3
     4     5   NaN
     7     8     9
(2)readmatrix()
clc
clear all
% readmatrix第一个参数是文件名。第二个参数指输出类型。如果不带这个参数,那么字符串那一列的输出结果是Nan值
% 加上之后,则全部输出文本类型,后面再把要作为数值型的内容转换数据类型。
data1 = readmatrix('D:\Desktop\data2.xlsx', 'OutputType', 'string')

% 命令行窗口输出结果
data1 = 
  7×6 string 数组
    "小红"    "女"    "20"    "130"    "140"    "135"
    "小汤"    "男"    "22"    "131"    "141"    "136"
    "小李"    "男"    "24"    "132"    "142"    "137"
    "小ai"    "男"    "21"    "133"    "143"    "138"
    "小张"    "男"    "25"    "134"    "144"    "139"
    "小小"    "男"    "20"    "135"    "145"    "140"
    "小耿"    "男"    "25"    "136"    "146"    "141"
(3)readtable()
clc
clear all
data2 = readtable('D:\Desktop\data2.xlsx')

% 命令行窗口输出结果
data2 =
  7×6 table
     name     gender    age    x__    x___1    x___2
    ______    ______    ___    ___    _____    _____

    '小红'     '女'      20     130     140      135 
    '小汤'     '男'      22     131     141      136 
    '小李'     '男'      24     132     142      137 
    '小ai'     '男'     21     133     143      138 
    '小张'     '男'      25     134     144      139 
    '小小'     '男'      20     135     145      140 
    '小耿'     '男'      25     136     146      141 
(4)xlswrite()(不推荐)
  • 将向量写入电子表格
  • 写入电子表格的特定工作表和范围
% (1)将矩阵A写入Microsoft®Excel®电子表格工作簿filename中的第一个工作表,从单元格A1开始写入。
xlswrite(filename,A)
% (2)将数据写入指定的工作表。
xlswrite(filename,A,sheet)
% (3)将数据写入工作簿的第一个工作表中由xlRange指定的矩形区域内。使用Excel范围语法,例如'A1:C3'。
xlswrite(filename,A,xlRange)
% (4)将数据写入指定的工作表和范围。
xlswrite(filename,A,sheet,xlRange)
% (5)使用先前语法中的任何输入参数返回写入操作的状态。当操作成功时,status为1。否则,status为0。
status = xlswrite(___)
% (6)还在结构体message中返回写入操作生成的任何警告或错误消息。
[status,message] = xlswrite(___)
clc
clear all

% 写入电子表格的特定工作表和范围
A = {'Time','Temperature'; 12,98; 13,99; 14,97}
sheet = 2
xlRange = 'E1'
xlswrite('D:\Desktop\mytest.xlsx',A,sheet,xlRange)
(5)writematrix()
clc
clear all

Excel_data = readmatrix('D:\Desktop\data2.xlsx', 'OutputType', 'string')
writematrix(Excel_data,'D:\Desktop\output2.xlsx')
% 我的MATLAB版本是R2019a,追加时显示参数名称 WriteMode无效
% writematrix(Excel_data,'D:\Desktop\output2.xlsx','WriteMode','append')

% 命令行窗口输出结果
Excel_data = 
  7×6 string 数组
    "小红"    "女"    "20"    "130"    "140"    "135"
    "小汤"    "男"    "22"    "131"    "141"    "136"
    "小李"    "男"    "24"    "132"    "142"    "137"
    "小ai"    "男"    "21"    "133"    "143"    "138"
    "小张"    "男"    "25"    "134"    "144"    "139"
    "小小"    "男"    "20"    "135"    "145"    "140"
    "小耿"    "男"    "25"    "136"    "146"    "141"
(6)writetable()
clc
clear all

LastName = {'Sanchez';'Johnson';'Li';'Diaz';'Brown'}
Age = [38;43;38;40;49]
Smoker = logical([1;0;1;0;1])
Height = [71;69;64;67;64]
Weight = [176;163;131;133;119]
BloodPressure = [124 93; 109 77; 125 83; 117 75; 122 80]
table_csv = table(LastName,Age,Smoker,Height,Weight,BloodPressure)
% 自定义列索引和行索引
table_csv.Properties.VariableNames = {'a','b','c','d','e','f'}
table_csv.Properties.RowNames = {'g','h','i','j','k'}
writetable(table_csv,"D:\Desktop\output3.xlsx")

% 命令行窗口输出结果
table_csv =
  5×6 table
             a        b       c      d      e         f     
         _________    __    _____    __    ___    __________
    g    'Sanchez'    38    true     71    176    124     93
    h    'Johnson'    43    false    69    163    109     77
    i    'Li'         38    true     64    131    125     83
    j    'Diaz'       40    false    67    133    117     75
    k    'Brown'      49    true     64    119    122     80

👀JSON

MATLAB读取JSON的方式利用JSONlab工具箱

①将下载的工具箱安装包解压缩放入MATLAB安装目录下的toolbox文件夹下;

②打开MATLAB,选择”主页“→”设置路径“,将工具箱所在文件夹导入。

JSON源文件

{
    "type": "FeatureCollection",
    "features": [{
            "type": "Feature",
            "properties": {},
            "geometry": {
                "coordinates": [[[116.3591064789793, 40.0611769097348], [116.35882714532096, 40.06035824493355], [116.3588680234169, 40.06017052423036], [116.3592154872361, 40.05968557668524], [116.35964470724883, 40.05949263960517], [116.36125939205749, 40.05968557668524], [116.36073478982053, 40.06143241456951], [116.3591064789793, 40.0611769097348]]],
                "type": "Polygon"
            }
        }, {
            "type": "Feature",
            "properties": {},
            "geometry": {
                "coordinates": [116.35838429946176, 40.0595499993847],
                "type": "Point"
            }
        }, {
            "type": "Feature",
            "properties": {},
            "geometry": {
                "coordinates": [116.36078873507478, 40.06152377992771],
                "type": "Point"
            }
        }
    ]
}

利用Matlab读取JSON

clc
clear all

% 读取json需要导入JSONlab工具箱
jsonData = loadjson('D:\Desktop\map.geojson')

% 命令行窗口输出结果
jsonData = 
  包含以下字段的 struct:
        type: 'FeatureCollection'
    features: [1×3 struct]

利用Matlab写入JSON

clc
clear all

% 创建结构体变量
data.type = 'Feature'
data.properties = {}
data.geometry.coordinates = [116.36078873507478, 40.06152377992771]
data.geometry.type = 'Point'

% 将结构体变量写入JSON文件
savejson('', data, 'D:\Desktop\test.json')
% 从JSON文件中读取数据
jsonData = loadjson('D:\Desktop\test.json')

% 命令行窗口输出结果
data = 
  包含以下字段的 struct:
    type: 'Feature'
data = 
  包含以下字段的 struct:
          type: 'Feature'
    properties: {}
data = 
  包含以下字段的 struct:
          type: 'Feature'
    properties: {}
      geometry: [1×1 struct]
data = 
  包含以下字段的 struct:
          type: 'Feature'
    properties: {}
      geometry: [1×1 struct]
jsonData = 
  包含以下字段的 struct:
          type: 'Feature'
    properties: {0×1 cell}
      geometry: [1×1 struct]

👀XML

参数详解见MATLAB帮助中心。

xmlread()读取XML文档并返回文档对象模型节点

  • XML文件读入文档对象模型 (DOM) 节点中

  • 将该XML文件读入MATLAB®结构体数组中

xmlwrite()写入XML文档对象模型节点

  • 创建XML文件

  • 以串行化文本形式获取文档对象模型 (DOM) 节点

% (1)读取指定的XML文件并返回一个Apache®Xerces-J文档对象,该对象表示该XML文件的解析版本。Apache Xerces-J实现用于XML处理的Java®API(JAXP)。使用JAXP函数来操作此文档对象。有关Apache Xerces-J的详细信息,请参阅https://xerces.apache.org/xerces-j/apiDocs/。
DOMnode = xmlread(filename)
% (2)还指定是否允许DOCTYPE声明。如果tf为false,则读取包含DOCTYPE声明的输入XML文件会导致错误。如果为true,xmlread则会为XML文件返回输出DOMnode。tf的默认值是true。
DOMnode = xmlread(filename,'AllowDoctype',tf)
% (1)将文档对象模型(DOM)节点DOMnode写入到文件filename。使用xmlwrite要求您使用用于XML处理的Java® API(JAXP)。有关详细信息,请参阅https://docs.oracle.com/javase/7/docs/api。
xmlwrite(filename,DOMnode)
% (2)以字符向量形式返回串行化DOM节点。
chr = xmlwrite(DOMnode)
(1)读取XML

XML源文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<breakfast_menu>
	<food>
		<name>Belgian Waffles</name>
		<price>$5.95</price>
		<calories>650</calories>
		<cropRegion x="0" y="0" width="0000" height="1234"/>
	</food>
	<food>
		<name>Strawberry Belgian Waffles</name>
		<price>$7.95</price>
		<calories>900</calories>
		<cropRegion x="1" y="1" width="1111" height="2345"/>
	</food>
	<food>
		<name>Berry-Berry Belgian Waffles</name>
		<price>$8.95</price>
		<calories>900</calories>
		<cropRegion x="2" y="2" width="2222" height="3456"/>
	</food>
	<food>
		<name>French Toast</name>
		<price>$4.50</price>
		<calories>600</calories>
		<cropRegion x="3" y="3" width="3333" height="4567"/>
	</food>
	<food>
		<name>Homestyle Breakfast</name>
		<price>$6.95</price>
		<calories>950</calories>
		<cropRegion x="4" y="4" width="4444" height="5678"/>
	</food>
</breakfast_menu>

利用xmlread()读取XML,同时利用函数 parseXML()将该XML文件读入MATLAB®结构体数组中:

% 创建一个解析函数以将一个XML文件读入MATLAB®结构体中,然后将一个示例XML文件读入MATLAB工作区中。要创建函数parseXML,请将以下代码复制并粘贴到m文件parseXML.m中。parseXML函数将一个XML文件中的数据解析为一个MATLAB结构体数组,该数组包含字段Name、Attributes、Data和Children。
function theStruct = parseXML(filename)
% PARSEXML Convert XML file to a MATLAB structure.
try
   tree = xmlread(filename);
catch
   error('Failed to read XML file %s.',filename);
end

% Recurse over child nodes. This could run into problems 
% with very deeply nested trees.
try
   theStruct = parseChildNodes(tree);
catch
   error('Unable to parse XML file %s.',filename);
end


% ----- Local function PARSECHILDNODES -----
function children = parseChildNodes(theNode)
% Recurse over node children.
children = [];
if theNode.hasChildNodes
   childNodes = theNode.getChildNodes;
   numChildNodes = childNodes.getLength;
   allocCell = cell(1, numChildNodes);

   children = struct(             ...
      'Name', allocCell, 'Attributes', allocCell,    ...
      'Data', allocCell, 'Children', allocCell);

    for count = 1:numChildNodes
        theChild = childNodes.item(count-1);
        children(count) = makeStructFromNode(theChild);
    end
end

% ----- Local function MAKESTRUCTFROMNODE -----
function nodeStruct = makeStructFromNode(theNode)
% Create structure of node info.

nodeStruct = struct(                        ...
   'Name', char(theNode.getNodeName),       ...
   'Attributes', parseAttributes(theNode),  ...
   'Data', '',                              ...
   'Children', parseChildNodes(theNode));

if any(strcmp(methods(theNode), 'getData'))
   nodeStruct.Data = char(theNode.getData); 
else
   nodeStruct.Data = '';
end

% ----- Local function PARSEATTRIBUTES -----
function attributes = parseAttributes(theNode)
% Create attributes structure.

attributes = [];
if theNode.hasAttributes
   theAttributes = theNode.getAttributes;
   numAttributes = theAttributes.getLength;
   allocCell = cell(1, numAttributes);
   attributes = struct('Name', allocCell, 'Value', ...
                       allocCell);

   for count = 1:numAttributes
      attrib = theAttributes.item(count-1);
      attributes(count).Name = char(attrib.getName);
      attributes(count).Value = char(attrib.getValue);
   end
end
clc
clear all

sampleXMLfile = 'D:\Desktop\simple.xml';
% 显示simple.xml文件内容
type(sampleXMLfile)
% 将该XML文件读入DOM节点中
% DOMnode = xmlread(sampleXMLfile)
% 使用parseXML函数将示例文件info.xml解析为一个MATLAB结构体。
mlStruct = parseXML(sampleXMLfile)

% 命令行窗口输出结果
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy庐 -->
<breakfast_menu>
	<food>
		<name>Belgian Waffles</name>
		<price>$5.95</price>
		<calories>650</calories>
		<cropRegion x="0" y="0" width="0000" height="1234"/>
	</food>
	<food>
		<name>Strawberry Belgian Waffles</name>
		<price>$7.95</price>
		<calories>900</calories>
		<cropRegion x="1" y="1" width="1111" height="2345"/>
	</food>
	<food>
		<name>Berry-Berry Belgian Waffles</name>
		<price>$8.95</price>
		<calories>900</calories>
		<cropRegion x="2" y="2" width="2222" height="3456"/>
	</food>
	<food>
		<name>French Toast</name>
		<price>$4.50</price>
		<calories>600</calories>
		<cropRegion x="3" y="3" width="3333" height="4567"/>
	</food>
	<food>
		<name>Homestyle Breakfast</name>
		<price>$6.95</price>
		<calories>950</calories>
		<cropRegion x="4" y="4" width="4444" height="5678"/>
	</food>
</breakfast_menu>

mlStruct = 
  包含以下字段的 1×2 struct 数组:
    Name
    Attributes
    Data
    Children
(2)写入XML

分两步编写XML文件:

①创建一个包含XML数据的文档对象模型 (DOM) 节点;

②将该DOM节点写入一个XML文件。

要实现的写入内容:

<?xml version="1.0" encoding="utf-8"?>
<toc version="2.0">
	<tocitem target="upslope_product_page.html">Upslope Area Toolbox<!-- Functions -->
		<tocitem target="demFlow_help.html">demFlow</tocitem>
		<tocitem target="facetFlow_help.html">facetFlow</tocitem>
		<tocitem target="flowMatrix_help.html">flowMatrix</tocitem>
		<tocitem target="pixelFlow_help.html">pixelFlow</tocitem>
	</tocitem>
</toc>

利用xmlwrite()写入XML文档:

clc
clear all

% 创建DOM节点对象和根元素,然后根据XML数据填充节点元素和节点属性。
docNode = com.mathworks.xml.XMLUtils.createDocument('toc');
% 确定根元素并设置version属性。
toc = docNode.getDocumentElement;
toc.setAttribute('version','2.0');
% 添加tocitem元素。此文件中的每个tocitem元素都有一个target属性和一个子文本节点。
product = docNode.createElement('tocitem');
product.setAttribute('target','upslope_product_page.html');
product.appendChild(docNode.createTextNode('Upslope Area Toolbox'));
toc.appendChild(product);
% 添加注释
product.appendChild(docNode.createComment(' Functions '));
% 为每个函数添加一个tocitem元素
functions = {'demFlow','facetFlow','flowMatrix','pixelFlow'};
for idx = 1:numel(functions)
    curr_node = docNode.createElement('tocitem');
    
    curr_file = [functions{idx} '_help.html']; 
    curr_node.setAttribute('target',curr_file);
    
    % Child text is the function name.
    curr_node.appendChild(docNode.createTextNode(functions{idx}));
    product.appendChild(curr_node);
end
% 将DOM节点导出到名为infoUAT.xml的XML文件中,并使用type函数查看该文件
xmlwrite('D:\Desktop\infoUAT.xml',docNode);
type('D:\Desktop\infoUAT.xml');

% 命令行窗口输出结果
<?xml version="1.0" encoding="utf-8"?>
<toc version="2.0">
   <tocitem target="upslope_product_page.html">Upslope Area Toolbox<!-- Functions -->		  <tocitem target="demFlow_help.html">demFlow</tocitem>
      <tocitem target="facetFlow_help.html">facetFlow</tocitem>
      <tocitem target="flowMatrix_help.html">flowMatrix</tocitem>
      <tocitem target="pixelFlow_help.html">pixelFlow</tocitem>
   </tocitem>
</toc>

👀TXT(函数例举)

  • textread()

  • textscan()

  • readmatrix()

  • writematrix()

  • readtable()

  • writetable()

  • load()

  • dlmread()

  • dlmwrite()

  • importdata()

  • save()

多谢!多谢!
笔者不才,请多交流!!!

欢迎大家关注预览我的博客Blog:HeartLoveLife
能力有限,敬请谅解!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值