参考书:《 M A T L A B {\rm MATLAB} MATLAB与学术图表绘制》(关东升)。
5.MATLAB数据导入
5.1 从CSV文件读取数据
-
C S V {\rm CSV} CSV文件是一种纯文本文件,文件中的数据以逗号为分隔符进行字段分隔,每一行数据代表一条记录,每个字段在该行内通过逗号进行分隔;
-
C S V {\rm CSV} CSV文件可以使用任何文本编辑器创建和编辑,且可以被很多应用软件程序和编程语言读取和处理;
-
C S V {\rm CSV} CSV文件通常用于存储表格数据,如:电子表格数据、数据库导出数据等;
-
r e a d t a b l e {\rm readtable} readtable函数:
-
作用: r e a d t a b l e {\rm readtable} readtable函数适用于读取包含混合数据类型,包括文本和数值的 C S V {\rm CSV} CSV文件,并将其导入为 M A T L A B {\rm MATLAB} MATLAB表格;
-
列名: r e a d t a b l e {\rm readtable} readtable自动将 C S V {\rm CSV} CSV文件的第一行作为列名,便于理解和操作数据;
-
r e a d t a b l e {\rm readtable} readtable语法:
% readtable语法: T = readtable(filename) T = readtable(filename, Name, Value) % T:表格数据结构,用于存储从文件中读取的数据; % filename:要读取的文件的路径和名称; % Name,Value:一些可选的名称-值对(即键值对),用于指定额外的选项,如跳过的行数等;
-
-
c s v r e a d {\rm csvread} csvread函数:
-
作用: c s v r e a d {\rm csvread} csvread函数适用于读取仅包含数值数据的 C S V {\rm CSV} CSV文件,并将其导入为 M A T L A B {\rm MATLAB} MATLAB数值矩阵;
-
数据类型:适用于纯数值数据,不支持文本列;
-
列名:不支持列名,只导入数值部分;
-
数据结构:导入的数据以数值矩阵的形式存储,适用于数值分析和计算;
-
c s v r e a d {\rm csvread} csvread语法:
% csvread语法: M = csvread(filename) M = csvread(filename, R1, C1) M = csvread(filename, R1, C1, R2, C2) % M:包含从CSV文件中读取的数值数据的矩阵; % filename:要读取的CSV文件的路径和名称; % R1、C1、R2、C2:用于指定要读取的数据范围的行和列;
-
-
r e a d t a b l e {\rm readtable} readtable函数使用示例:
% ch05_01.m clear; clc; % 创建要读取的文件路径; filePath = 'ch05_01.csv'; data1 = readtable(filePath); disp(data1(1:2,:)); % 显示前两行数据; disp('=============================================='); disp(data1(1:5,:)); % 显示前五行数据; disp('=============================================='); disp(data1(:,:)); % 显示整个文件数据;
% ch05_01.m运行结果: Name Age Height Weight ___________ ___ ______ ______ {'Willard'} 20 172 60 {'Chen' } 18 160 45 ============================================== Name Age Height Weight ___________ ___ ______ ______ {'Willard'} 20 172 60 {'Chen' } 18 160 45 {'Zhang' } 18 165 46 {'LiuQB' } 28 170 55 {'Zhou' } 19 166 46 ============================================== Name Age Height Weight ___________ ___ ______ ______ {'Willard'} 20 172 60 {'Chen' } 18 160 45 {'Zhang' } 18 165 46 {'LiuQB' } 28 170 55 {'Zhou' } 19 166 46
-
c s v r e a d {\rm csvread} csvread函数使用示例:
% ch05_02.m clear; clc; % 创建要读取的文件路径; filePath = 'ch05_02.csv'; % 注:字符串读取不了,如:姓名列(name):Willard、Chen这些数据读取不了; data2 = csvread(filePath,1,1); % 从第2行第2列开始读取数据; disp(data2);
% ch05_02.m运行结果: 20 172 60 18 160 45 18 165 46 28 170 55 19 166 46
5.2 从Excel文件读取数据
-
M A T L A B {\rm MATLAB} MATLAB中,可以使用 x l s r e a d {\rm xlsread} xlsread函数和 r e a d t a b l e {\rm readtable} readtable函数从 E x c e l {\rm Excel} Excel文件导入数据;
-
x l s r e a d {\rm xlsread} xlsread函数特点:
- 返回一个数值矩阵,不返回列标签;
- 主要用于读取 E x c e l {\rm Excel} Excel文件中的数值数据,不擅长读取文本数据;
- 通常需要指定要读取的数据范围,包括工作表名称、索引及数据范围;
- 通常需要额外的处理来处理数据类型和列标签;
-
x l s r e a d {\rm xlsread} xlsread函数语法:
% xlsread函数语法: [num, txt, raw] = xlsread(filename) [num, txt, raw] = xlsread(filename, sheet) [num, txt, raw] = xlsread(filename, sheet, range) % num:一个包含数值数据的矩阵; % txt:一个包含文本数据的单元格数组; % raw:一个包含原始数据的混合单元格数组; % filename:要读取的Excel文件的路径和名称; % sheet:要读取的工作表的名称和索引; % range:要读取的数据范围;
-
r e a d t a b l e {\rm readtable} readtable函数使用示例:
% ch05_03.m clear; clc; % 指定数据文件路径 filePath = 'ch05_03.xls'; % 指定要读取的数据范围(第1列至第6列,第4行至第23行数据) data_range = 'A4:F23'; % 使用readtable函数读取指定范围的数据 data = readtable(filePath, 'Range', data_range); % 显示数据 disp(data);
% ch05_03.m运行结果: Var1 Var2 Var3 Var4 Var5 Var6 __________ __________ _____ _____ _____ _____ {'2018年'} 1.3954e+05 71351 68187 83137 56401 {'2017年'} 1.3901e+05 71137 67871 81347 57661 {'2016年'} 1.3827e+05 70815 67456 79298 58973 {'2015年'} 1.3746e+05 70414 67048 77116 60346 {'2014年'} 1.3678e+05 70079 66703 74916 61866 {'2013年'} 1.3607e+05 69728 66344 73111 62961 {'2012年'} 1.354e+05 69395 66009 71182 64222 {'2011年'} 1.3474e+05 69068 65667 69079 65656 {'2010年'} 1.3409e+05 68748 65343 66978 67113 {'2009年'} 1.3345e+05 68647 64803 64512 68938 {'2008年'} 1.328e+05 68357 64445 62403 70399 {'2007年'} 1.3213e+05 68048 64081 60633 71496 {'2006年'} 1.3145e+05 67728 63720 58288 73160 {'2005年'} 1.3076e+05 67375 63381 56212 74544 {'2004年'} 1.2999e+05 66976 63012 54283 75705 {'2003年'} 1.2923e+05 66556 62671 52376 76851 {'2002年'} 1.2845e+05 66115 62338 50212 78241 {'2001年'} 1.2763e+05 65672 61955 48064 79563 {'2000年'} 1.2674e+05 65437 61306 45906 80837 {'1999年'} 1.2579e+05 64692 61094 43748 82038
-
x l s r e a d {\rm xlsread} xlsread函数使用示例:
% ch05_04.m clear; clc; % 指定数据文件路径 filePath = 'ch05_04.xls'; % 指定要读取的数据范围(第1列至第6列,第4行至第23行数据) data_range = 'A4:F23'; % 使用xlsread函数读取数据 % num:包含从Excel文件中读取的数值数据; % txt:包含文本数据; % raw:包含原始数据,包括数值和文本数据; [num, txt, raw] = xlsread(filePath, data_range); disp('Excel文件中的数值数据:'); disp(num); disp('Excel文件中的文本数据:'); disp(txt); disp('Excel文件中的原始数据:'); disp(raw);
% ch05_04.m运行结果: Excel文件中的数值数据: 139538 71351 68187 83137 56401 139008 71137 67871 81347 57661 138271 70815 67456 79298 58973 137462 70414 67048 77116 60346 136782 70079 66703 74916 61866 136072 69728 66344 73111 62961 135404 69395 66009 71182 64222 134735 69068 65667 69079 65656 134091 68748 65343 66978 67113 133450 68647 64803 64512 68938 132802 68357 64445 62403 70399 132129 68048 64081 60633 71496 131448 67728 63720 58288 73160 130756 67375 63381 56212 74544 129988 66976 63012 54283 75705 129227 66556 62671 52376 76851 128453 66115 62338 50212 78241 127627 65672 61955 48064 79563 126743 65437 61306 45906 80837 125786 64692 61094 43748 82038 Excel文件中的文本数据: {'2018年'} {'2017年'} {'2016年'} {'2015年'} {'2014年'} {'2013年'} {'2012年'} {'2011年'} {'2010年'} {'2009年'} {'2008年'} {'2007年'} {'2006年'} {'2005年'} {'2004年'} {'2003年'} {'2002年'} {'2001年'} {'2000年'} {'1999年'} Excel文件中的原始数据: {'2018年'} {[139538]} {[71351]} {[68187]} {[83137]} {[56401]} {'2017年'} {[139008]} {[71137]} {[67871]} {[81347]} {[57661]} {'2016年'} {[138271]} {[70815]} {[67456]} {[79298]} {[58973]} {'2015年'} {[137462]} {[70414]} {[67048]} {[77116]} {[60346]} {'2014年'} {[136782]} {[70079]} {[66703]} {[74916]} {[61866]} {'2013年'} {[136072]} {[69728]} {[66344]} {[73111]} {[62961]} {'2012年'} {[135404]} {[69395]} {[66009]} {[71182]} {[64222]} {'2011年'} {[134735]} {[69068]} {[65667]} {[69079]} {[65656]} {'2010年'} {[134091]} {[68748]} {[65343]} {[66978]} {[67113]} {'2009年'} {[133450]} {[68647]} {[64803]} {[64512]} {[68938]} {'2008年'} {[132802]} {[68357]} {[64445]} {[62403]} {[70399]} {'2007年'} {[132129]} {[68048]} {[64081]} {[60633]} {[71496]} {'2006年'} {[131448]} {[67728]} {[63720]} {[58288]} {[73160]} {'2005年'} {[130756]} {[67375]} {[63381]} {[56212]} {[74544]} {'2004年'} {[129988]} {[66976]} {[63012]} {[54283]} {[75705]} {'2003年'} {[129227]} {[66556]} {[62671]} {[52376]} {[76851]} {'2002年'} {[128453]} {[66115]} {[62338]} {[50212]} {[78241]} {'2001年'} {[127627]} {[65672]} {[61955]} {[48064]} {[79563]} {'2000年'} {[126743]} {[65437]} {[61306]} {[45906]} {[80837]} {'1999年'} {[125786]} {[64692]} {[61094]} {[43748]} {[82038]}
5.3 从JSON文件读取数据
-
J S O N ( J a v a S c r i p t O b j e c t N o t a t i o n ) {\rm JSON(JavaScript\ Object\ Notation)} JSON(JavaScript Object Notation)文件以文本形式表示结构化数据;
-
J S O N {\rm JSON} JSON结构:
// JSON示例: [ { "name": "Willard", "Age": 20, "Height": 170, "Weight": 60 }, { "name": "Chen", "Age": 18, "Height": 160, "Weight": 48 } ] // 1.大括号{}表示一个JSON对象,包含键值对的集合,每个键值对由一个键(key)和一个关联值(value)组成, // 键和值间用冒号分隔,键值对间用逗号分隔,JSON对象用于表示具有命名字段的数据; // 2.中括号[]表示一个JSON数组,包含值的有序集合,JSON数组允许用户将多个值按一定的顺序进行组织; // 数组中的每个值可以是一个标量或另一个JSON对象或JSON数组,JSON数组通常用于表示多个相似的数据项;
-
读取 J S O N {\rm JSON} JSON文件数据示例:
% ch05_05.m clear; clc; % 读取JSON文件并存储在jsonStr变量中; jsonStr = fileread('ch05_05.json'); % 使用jsondecode函数将JSON字符串解码为MATLAB结构体; jsonData = jsondecode(jsonStr); % 访问和操作解码后的数据; for i = 1:length(jsonData) name = jsonData(i).Name; age = jsonData(i).Age; height = jsonData(i).Height; weight = jsonData(i).Weight; fprintf('Name: %s\n',name); fprintf('Age: %d, Height: %d, Weight: %d\n\n',age, height, weight); end
% ch05_05.m运行结果: Name: Willard Age: 20, Height: 170, Weight: 60 Name: Chen Age: 18, Height: 160, Weight: 46 Name: Zhang Age: 18, Height: 166, Weight: 48
// ch05_05.json文件内容 [ { "Name": "Willard", "Age": 20, "Height": 170, "Weight": 60 }, { "Name": "Chen", "Age": 18, "Height": 160, "Weight": 46 }, { "Name": "Zhang", "Age": 18, "Height": 166, "Weight": 48 } ]
5.4 从XML文件读取数据
-
X M L ( E x t e n s i b l e M a r k u p L a n g u a g e ) {\rm XML(Extensible\ Markup\ Language)} XML(Extensible Markup Language):一种用于存储和交换数据的文本格式;
-
X M L {\rm XML} XML是一种标记语言,用于描述数据的结构和内容, X M L {\rm XML} XML文件包含各种数据,这些数据使用标签和元素来标识和组织,每个 X M L {\rm XML} XML元素都由一个开始标签、元素内容和结束标签组成;
-
X M L {\rm XML} XML语法示例:
<?xml version="1.0" encoding="UTF-8"?> <studentInfoData> <Name name="Willard"> <Age>20</Age> <Height>172</Height> <Weight>60</Weight> </Name> <Name name="Chen"> <Age>18</Age> <Height>156</Height> <Weight>46</Weight> </Name> </studentInfoData>
-
读取 X M L {\rm XML} XML数据示例:
% ch05_06.m clear; clc; % 读取XML文件 xmlFile = 'ch05_06.xml'; % 使用xmlread函数解析XML文件 doc = xmlread(xmlFile); % 获取根元素(AirQualityData) root = doc.getDocumentElement(); % 获取City元素的节点列表 cityNodes = root.getElementsByTagName('City'); % 初始化一个结构数组,用于存储城市数据 cityData = struct(); % 遍历每个City元素 for i = 0:cityNodes.getLength - 1 cityNode = cityNodes.item(i); % 获取城市的名称属性 cityName = char(cityNode.getAttribute('name')); % 获取Year、PM25_Concentration、PM10_Concentration、SO2_Concentration和CO_Concentration的值 year = str2double(cityNode.getElementsByTagName('Year').item(0).getTextContent()); pm25 = str2double(cityNode.getElementsByTagName('PM25_Concentration').item(0).getTextContent()); pm10 = str2double(cityNode.getElementsByTagName('PM10_Concentration').item(0).getTextContent()); so2 = str2double(cityNode.getElementsByTagName('SO2_Concentration').item(0).getTextContent()); co = str2double(cityNode.getElementsByTagName('CO_Concentration').item(0).getTextContent()); % 存储城市数据到结构数组 cityData(i+1).name = cityName; cityData(i+1).year = year; cityData(i+1).PM25_Concentration = pm25; cityData(i+1).PM10_Concentration = pm10; cityData(i+1).SO2_Concentration = so2; cityData(i+1).CO_Concentration = co; end
<?xml version="1.0" encoding="UTF-8"?> <AirQualityData> <City name="北京"> <Year>2018</Year> <PM25_Concentration>25</PM25_Concentration> <PM10_Concentration>40</PM10_Concentration> <SO2_Concentration>10</SO2_Concentration> <CO_Concentration>5</CO_Concentration> </City> <City name="上海"> <Year>2018</Year> <PM25_Concentration>35</PM25_Concentration> <PM10_Concentration>50</PM10_Concentration> <SO2_Concentration>15</SO2_Concentration> <CO_Concentration>8</CO_Concentration> </City> <City name="广州"> <Year>2018</Year> <PM25_Concentration>45</PM25_Concentration> <PM10_Concentration>60</PM10_Concentration> <SO2_Concentration>20</SO2_Concentration> <CO_Concentration>10</CO_Concentration> </City> </AirQualityData>
5.5 从mat文件读取数据
-
m a t {\rm mat} mat是 M A T L A B {\rm MATLAB} MATLAB基于二进制的专有的数据文件格式,用来保存 M A T L A B {\rm MATLAB} MATLAB中的数据,包括矩阵、数组、字符串等;
-
m a t {\rm mat} mat文件的主要特点包括:
- 可以方便地保存 M A T L A B {\rm MATLAB} MATLAB的任意数据,包括多维数组、结构数组等复杂数据;
- 数据以压缩的二进制格式保存,文件体积小;
- 通过 m a t {\rm mat} mat文件可以地在 M A T L A B {\rm MATLAB} MATLAB和其他语言间交换数据;
- 使用 M A T L A B {\rm MATLAB} MATLAB的 s a v e {\rm save} save函数和 l o a d {\rm load} load函数可以方便地读写 m a t {\rm mat} mat文件;
-
读取 m a t {\rm mat} mat数据使用示例:
% ch05_07.m clear; clc; % 生成8x8的随机数据矩阵并存储在变量data中; data = rand(8); save('ch05_07.mat','data'); clear; % 使用load函数从ch05_07.mat文件加载数据; load('ch05_07.mat'); % 将加载的数据存储在newdata变量中; newdata = data; % 使用plot函数绘制newdata中的数据; plot(newdata); set(findobj(get(gca,'Children'),'LineWidth',0.5),'LineWidth',1.5); xlabel('x'); ylabel('y'); % 返回每一列的最大值; msg = sprintf('最大值:%f',max(newdata)); disp(msg); % 将newdata变量保存到newdata.mat文件中; save('newdata.mat','newdata');