从文件中读取变量
[Var1, Var2,…,VarN] = readvars(
通过从文件中读取面向列的数据来创建变量。如果文件包含文件名
)ñ
数据列,则readvars
回报ñ
变量Var1 Var2,…, VarN
。
readvars
从文件扩展名确定文件格式:
. txt
,.DAT
,或. csv
用于分隔的文本文件
的.xls
,.xlsb
,.xlsm
,.xlsx
,.xltm
,.xltx
,或。ods
电子表格文件
从一个文本文件作为独立变量表格数据导入列。首先,预览文本文件的内容outages.csv
然后阅读专栏。
预览数据outages.csv
。该文件有6
变量。
选择= detectImportOptions (“outages.csv”);预览(“outages.csv”选择)
ans =8×6表地区OutageTime客户流失RestorationTime原因_____________ ____________________ ______ __________ ____________________ ___________________ { '西南'} 01 - 2月 - 2002十二时18分00秒458.98 1.8202e + 06 07 - 2月 - 2002年16:50:00 { '暴风雪'} {”东南 '} 23-JAN-2003〇点49分00秒530.14 2.1204e + 05的NaT {' 暴风雪”} { '东南'} 07 - 2月 - 2003二十一点15分00秒289.4 1.4294e + 05 17 - 2月 - 2003八时十四分00秒{ '暴风雪'} { '西'} 06-APR-2004五时44分00秒434.81 3.4037e + 05 06-APR-2004 6点10分零零秒{ '设备故障'} {“中西部'} 3月16日 - 2002年六时18分00秒186.44 2.1275e + 05 18-MAR-2002二十三时23分00秒{' 剧烈风暴”} { '西'} 18君2003 2时49分零零秒0 018军,2003 10:54:00 { '攻击'} { '西'} 20军,2004年14:39:00 231.29 NaN的20军,2004年19时16分○○秒{ '设备故障'} {”西”} 06 - 2002十九时28分00秒311.86 NaN的07军,2002年零点51分00秒{‘设备故障’}
导入前三栏作为在工作不同的变量。
(地区、OutageTime损失)= readvars (“outages.csv”);谁是地区OutageTime损失
名称大小字节类属性丢失1468x1 11744双OutageTime 1468x1 23489 datetime Region 1468x1 186732 cell
将电子表格文件中的列作为工作区中的单独变量导入。首先,预览文本文件的内容outages.csv
然后将列作为单独的变量读取。
预览数据patients.xls
。该文件有10
变量。
选择= detectImportOptions ('patients.xls');预览('patients.xls'选择)
ans =8×10表名字性别年龄所在地身高体重吸烟者心脏收缩舒张SelfAssessedHealthStatus ____________ __________ ___ _____________________________ ______ ______ ______ ________ _________ ________________________ { '史密斯'} { '男'} 38 { '县综合医院'} 71 176真正的124 93 { '优秀'} {”约翰逊 '} { '男'} {43 'VA医院'} 69 163 109假{77 '公平'} { '威廉姆斯'} { '女'} {38' 圣玛丽的医疗中心 '} 64 131假125 83 {' 好 '} { '琼斯'} { '女'} 40 { 'VA医院'} 67 133假117 75 { '公平'} { '布朗'} {' 女'} 49 {' 县综合医院 '} 64 119 122假80 { '良好'} { '戴维斯'} { '女'} 46 {' 圣玛丽的医疗中心 '} 68 142假121 70 {' 好 '} { '米勒'} { '女'} 33 { 'VA医院'} 64 142真正的130 88 { '好'} { '威尔逊'} {' 男'} 40 {' VA医院”} 68 180 115假82 { '良好'}
导入前三栏作为在工作不同的变量。
[姓氏,性别,年龄] = readvars('patients.xls');谁是姓性别年龄
名称大小字节类属性年龄100x1 800双性别100x1 12212细胞LastName 100x1 12416细胞
预览电子表格文件中的数据,并将指定工作表中的数据列和范围作为单独的变量导入。
电子表格文件airlinesmall_subset.xlsx
包含多个工作表的数据为1996年和2008年间年每个工作表中有某一年的数据。从预览文件中的数据airlinesmall_subset.xlsx
。的预览
函数默认显示来自第一个工作表的数据。
选择= detectImportOptions (“airlinesmall_subset.xlsx”);预览(“airlinesmall_subset.xlsx”选择)
ans =表8×29年月DayofMonth DayOfWeek DepTime CRSDepTime ArrTime CRSArrTime UniqueCarrier FlightNum TailNum ActualElapsedTime CRSElapsedTime通话时间ArrDelay DepDelay起源桌子距离TaxiIn TaxiOut取消CancellationCode转移CarrierDelay WeatherDelay SDelay SecurityDelay LateAircraftDelay ___ _____ _____ _____ __________和__________ _________________ ___________ _____累积说_________________ * * * _________ ________ _____________ ___________ ________ _______ _______ _____ _________________ _________________ 18 4 1996 2117 2120 2305 2259 415{“惠普”}{‘N637AW} 108 99 85 6 3{'因为'}{‘PHX} 551 5 18 0 {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} 1996 1 12 5 1252 1245 1511 1500 610{“惠普”}{‘N905AW} 79 75 58 11 7{“宽松”}{‘PHX} 370 3 18 0 {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} 1996 1 16 2 1441 1445 1708 1721 211{“惠普”}{‘N165AW} 87 9674 -13 4{‘汽车’}{‘PHX} 601 4 9 0 {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} 1996 1 1 1 2258 2300 2336 2335 1245{“惠普”}{‘N183AW} 38 35 20 1 2{“摘要”}{‘PHX} 110 6 12 0 {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} 1996 1 4 4 1814 683 1814 1901 1910{‘我们’}{‘N963VJ} 47 56 34 9 0{的DTW}{‘坑’}201 6 7 0 {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} 1996 1 31 3 1822 757 1820 1934 1925{‘我们’}{‘N912VJ} 72 65 52 9 2{‘PHL}{‘坑’}267 6 14 0 {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} 1996 1 18 4 729 1564 730 841 843{‘我们’}{‘N941VJ} 72 73 58 2 1 {DCA的}{PVD的}357 3 11 0 {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} 1996 1 26 5 1704 1705 1829 1839 1538{“西北”}{‘N960N} 85 94 69 -10 1{的DTW}{的RIC} 456 3 13 0 {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char}
属性中配置值OPTS
对象导入10
列的行五
和6
命名工作表'2007'
。
选择。表='2007';opts.SelectedVariableNames = [5 6];opts.DataRange =“二”;[DepTime,CRSDepTime] = readvars(“airlinesmall_subset.xlsx”、选择);
显示变量。
[DepTime, CRSDepTime]
ANS =10×2711 710 652 655 1116 1120 825 825 1411 1400 1935 1935 2005年1525 1525 1133 1105 922 925
预览电子表格文件中的数据,并将列作为指定工作表和范围中的独立变量导入。
电子表格文件airlinesmall_subset.xlsx
包含多个工作表的数据为1996年和2008年间年每个工作表中有某一年的数据。从预览文件中的数据airlinesmall_subset.xlsx
。的预览
函数默认显示来自第一个工作表的数据。
选择= detectImportOptions (“airlinesmall_subset.xlsx”);预览(“airlinesmall_subset.xlsx”选择)
ans =表8×29年月DayofMonth DayOfWeek DepTime CRSDepTime ArrTime CRSArrTime UniqueCarrier FlightNum TailNum ActualElapsedTime CRSElapsedTime通话时间ArrDelay DepDelay起源桌子距离TaxiIn TaxiOut取消CancellationCode转移CarrierDelay WeatherDelay SDelay SecurityDelay LateAircraftDelay ___ _____ _____ _____ __________和__________ _________________ ___________ _____累积说_________________ * * * _________ ________ _____________ ___________ ________ _______ _______ _____ _________________ _________________ 18 4 1996 2117 2120 2305 2259 415{“惠普”}{‘N637AW} 108 99 85 6 3{'因为'}{‘PHX} 551 5 18 0 {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} 1996 1 12 5 1252 1245 1511 1500 610{“惠普”}{‘N905AW} 79 75 58 11 7{“宽松”}{‘PHX} 370 3 18 0 {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} 1996 1 16 2 1441 1445 1708 1721 211{“惠普”}{‘N165AW} 87 9674 -13 4{‘汽车’}{‘PHX} 601 4 9 0 {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} 1996 1 1 1 2258 2300 2336 2335 1245{“惠普”}{‘N183AW} 38 35 20 1 2{“摘要”}{‘PHX} 110 6 12 0 {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} 1996 1 4 4 1814 683 1814 1901 1910{‘我们’}{‘N963VJ} 47 56 34 9 0{的DTW}{‘坑’}201 6 7 0 {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} 1996 1 31 3 1822 757 1820 1934 1925{‘我们’}{‘N912VJ} 72 65 52 9 2{‘PHL}{‘坑’}267 6 14 0 {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} 1996 1 18 4 729 1564 730 841 843{‘我们’}{‘N941VJ} 72 73 58 2 1 {DCA的}{PVD的}357 3 11 0 {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} 1996 1 26 5 1704 1705 1829 1839 1538{“西北”}{‘N960N} 85 94 69 -10 1{的DTW}{的RIC} 456 3 13 0 {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char} {0 x0 char}
进口10
工作表中命名的前三个变量的行'2007'
。
[年,月,DAYOFMONTH] = readvars(“airlinesmall_subset.xlsx”,“表”,'2007','范围','A2:C11');谁是年月DayOfMonth
名称大小字节类属性月日10x1 80双月10x1 80双年10x1 80双年
DISP([年月DAYOFMONTH])
2007年1 2 2007 1 3 2007 1 4 2007 1 5 2007 1 2007 7 1 8 1 2007 9 2007 1 11 2007 112 2007 1 13
文件名
-文件的名称阅读要读取的文件的名称,指定为字符向量或字符串标量。
根据文件的位置,文件名
可以采取这些形式之一。
位置 |
形成 |
||||||||
---|---|---|---|---|---|---|---|---|---|
当前文件夹或MATLAB上的文件夹®路径 | 指定的文件名 例子: |
||||||||
文件的文件夹中 |
如果文件不是在当前文件夹或MATLAB路径上的文件夹中,然后指定的完整或相对路径名 例子: 例子: |
||||||||
偏远的地点 |
如果文件存储在远程位置,则
基于你的远程位置,
有关更多信息,请参见处理远程数据。 例子: |
如果文件名
包括文件扩展名,然后进口函数确定来自扩展名的文件格式。否则,您必须指定'文件类型'
名称-值对参数,指示文件的类型。
在Windows上®与微软系统®Excel®软件,进口函数读取您的Excel版本认可的Excel电子表格文件格式。
如果您的系统没有用于Windows的Excel,或者您正在使用MATLAB在线™,则导入函数对UseExcel
属性设置为假
,只供阅读.xls, .xlsx, .xlsm, .xltx,和。xltm
文件。
对于带分隔符的文本文件,导入函数将文件中的空字段转换为为NaN
(对于数值变量)或空字符向量(对于文本变量)。文本文件中的所有行必须具有相同数量的分隔符。导入函数将忽略文件中不重要的空白。
数据类型:字符
|字符串
OPTS
-文件导入选项SpreadsheetImportOptions
|DelimitedtextImportOptions
|FixedWidthImportOptions
文件导入选项,指定为SpreadsheetImportOptions
,DelimitedTextImportOptions
,或FixedWidthImportOptions
目的是通过创建detectImportOptions
函数。的OPTS
对象包含控制数据导入过程的性质。有关每个对象的属性的详细信息,请参阅相应对象的页面。
文件类型 | 产量 |
---|---|
电子表格文件 | SpreadsheetImportOptions 宾语 |
文本文件 | DelimitedTextImportOptions 宾语 |
固定宽度的文本文件 | FixedWidthImportOptions 宾语 |
指定可选的用逗号分隔的对名称,值
参数。的名字
是参数的名称和价值
是对应的值。的名字
必须出现引号内。您可以按照任何顺序指定多个名称和值对参数Name1, Value1,…,的家
。
'NumHeaderLines',5
指示表格数据之前的前五行是标题行。
'文件类型'
-类型的文件“文本”
|“表格”
类型的文件,指定为逗号分隔的一对组成的'文件类型'
和“文本”
或“表格”
。
指定'文件类型'
方法时的名称-值对参数文件名
不包括文件扩展名,或者如果扩展名是比下面的一个其它:
. txt
,.DAT
,或. csv
用于分隔的文本文件
的.xls
,.xlsb
,.xlsm
,.xlsx
,.xltm
,.xltx
,或。ods
电子表格文件
例子:“文件类型”、“文本”
数据类型:字符
|字符串
“NumHeaderLines”
-标题行数文件中的标题行数,指定为逗号分隔的对“NumHeaderLines”
一个正整数。如果未指定,导入功能自动检测的文件中的首标线的数量。
例子:'NumHeaderLines',7
数据类型:单
|双
“ExpectedNumVariables”
-预计许多变数预期数量的变量,指定为逗号分隔的一对组成的“ExpectedNumVariables”
一个正整数。如果未指定,导入函数将自动检测变量的数量。
数据类型:单
|双
'范围'
-数据的一部分读从文本或电子表格文件读取数据,指定为逗号的部分分开一对组成的'范围'
和这些形式之一的字符向量、字符串标量或数字向量。
指定的方法范围 |
描述 |
---|---|
从细胞
|
将数据的起始单元格指定为字符向量或字符串标量或两个元素的数字向量。
使用起始单元格,导入函数通过从起始单元格开始导入并在最后一个空行或页脚范围结束来自动检测数据的范围。 例子: |
矩形范围
|
在其中一个表单中使用矩形范围指定要读取的确切范围。
导入函数只读取指定范围内的数据。指定范围内的任何空字段都将作为丢失的单元导入。 |
行范围或列范围
|
通过使用Excel行号标识开始和结束行来指定范围。 使用指定的行范围时,导入功能自动通过从第一非空列中的数据的读出结束检测柱程度,并创建每列一个变量。 例子: 可替代地,通过识别开始和结束使用Excel列字母或数字列指定的范围内。 导入函数使用指定的列范围,通过从第一个非空行读取到数据结尾或页脚范围,自动检测行范围。 指定范围内的列数必须与在 例子: |
起始行号
|
使用正向标量行索引指定包含数据的第一行。 使用指定的行索引,进口功能自动通过从指定的第一行读出到数据或页脚范围的结束检测数据的程度。 例子: |
Excel的命名范围
|
在Excel中,您可以创建名称来标识电子表格中的范围。例如,您可以选择电子表格中的矩形区域,并调用它 例子: |
不明或空
|
如果未指定,导入函数将自动检测使用的范围。 例子: 注意:使用范围指电子表格中实际包含数据的矩形部分。导入函数通过修剪任何不包含数据的行和列来自动检测使用的范围。仅为空白的文本被视为数据,并在使用范围内捕获。 |
数据类型:字符
|字符串
|双
“TextType”
-键入导入的文本数据“字符”
(默认)|“字符串”
导入文本数据的类型,指定为逗号分隔的对“TextType”
,要么“字符”
或“字符串”
。
“字符”
-将文本数据作为字符向量导入MATLAB。
“字符串”
-将文本数据作为字符串数组导入MATLAB。
例子:“TextType”、“生物炭”
'DatetimeType'
-输入日期和时间数据“datetime”
(默认)|“文本”
|“exceldatenum”
(电子表格文件)键入进口日期和时间数据,指定为逗号分隔的一对组成的'DatetimeType'
这些值之一:“datetime”
,“文本”
,或“exceldatenum”
。的值“exceldatenum”
仅适用于电子表格文件,而不是有效的文本文件。
价值 | 键入导入的日期和时间数据 |
---|---|
“datetime” |
MATLAB 有关更多信息,请参见 |
“文本” |
如果
|
“exceldatenum” |
Excel中的序列日期数字 序列号是一个数字,它等于给定参考日期的天数。Excel序列号使用的参考日期与MATLAB序列号不同。有关Excel日期的更多信息,请参见 |
数据类型:字符
|字符串
'TreatAsMissing'
-文本解释为丢失的数据文本解释为丢失数据,指定为字符向量,串标量,字符向量的单元阵列中,或字符串数组。
例子:'TreatAsMissing',{ 'NA', 'TBD'}
指示导入函数处理任何发生的NA
或TBD
作为一个缺失的字段。
数据类型:字符
|字符串
|细胞
“分隔符”
-现场分隔符在一个分隔的文本文件字段分隔符,指定为字符向量,串标量,字符向量的单元阵列中,或字符串数组。
例子:“分隔符”,“|”
例子:“分隔符”,{‘;’,‘*’}
数据类型:字符
|字符串
|细胞
“空格”
-将字符视为空白字符当作空白,指定为包含一个或多个字符的向量或标量的字符串。
例子:“空白”、“_”
例子:“空白”、“? !”
'LineEnding'
-结束行的字符{ '\ n', '\ r', '\ r \ n'}
(默认)|特征向量|字符串标量|字符向量的单元数组|字符串数组行结束字符,指定为字符向量、字符串标量、字符向量的单元数组或字符串数组。
例子:' LineEnding ', ' \ n '
例子:'LineEnding', '\ r \ N'
例子:'LineEnding',{ '\ B', ':'}
数据类型:字符
|字符串
|细胞
'CommentStyle'
-风格的评论的评论风格,指定为字符向量,串标量,字符向量的单元阵列中,或字符串数组。
例如,要忽略同一行的百分号后面的文本,请指定CommentStyle
如“%”
。
例子:CommentStyle, {“/ *”}
数据类型:字符
|字符串
|细胞
“编码”
-字符编码方案“系统”
|“utf - 8”
|“iso - 8859 - 1”
|“windows - 1251”
|“windows - 1252”
|……字符编码方案与文件相关联,指定为逗号分隔的一对组成的“编码”
和“系统”
或标准字符编码方案名称,在此表中的值的诸如一个。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
例子:“编码”、“系统”
使用系统默认编码。
数据类型:字符
|字符串
“DurationType”
-持续时间数据的输出的数据类型“持续时间”
(默认)|“文本”
从文本文件中输出持续时间数据的数据类型,指定为由逗号分隔的对组成“DurationType”
,要么“持续时间”
或“文本”
。
价值 | 键入进口持续时间数据 |
---|---|
“持续时间” |
MATLAB 有关更多信息,请参见 |
“文本” |
如果
|
数据类型:字符
|字符串
'DateLocale'
-读取日期的区域设置用于读取日期的区域设置,指定为逗号分隔的对'DateLocale'
以及该形式的字符向量或字符串标量
,地点:xx
_YY
YY
是表示国家的大写ISO 3166-1 alpha-2代码。
xx
是一个表示语言的小写ISO 639-1双字母代码。
有关区域设置的公共值列表,请参见语言环境
属性的名-值对参数datetime
函数。
当使用%d
格式化说明符来读取文本datetime
值,使用DateLocale
要指定导入函数应该在其中解释月份和星期几名称和缩写的区域设置。
如果你指定DateLocale
参数除了OPTS
的值,然后导入函数使用指定的值DateLocale
参数,重写导入选项中定义的区域设置。
例子:“DateLocale”、“ja_JP”
'DecimalSeparator'
-字符显示小数点分隔符指示数值变量中十进制分隔符的字符,指定为字符向量或字符串标量。函数中指定的字符DecimalSeparator
名称-值对,用于区分数字的整数部分和小数部分。
当转换到整数数据类型,具有小数部分的数字被四舍五入到最接近的整数。
例子:如果将名称-值对指定为'DecimalSeparator', ''
,然后导入函数导入文本“14159”
数量3.14159
。
数据类型:字符
|字符串
'ThousandsSeparator'
-字符表示千分组表示数值变量中数千个分组的字符,指定为字符向量或字符串标量。数千个分组字符充当可视分隔符,每三个位置值对数字进行分组。函数中指定的字符ThousandsSeparator
名称 - 值对解释导入的数字。
例子:如果将名称-值对指定为“ThousandsSeparator”、“,”
,然后导入函数导入文本“1234000”
如1234000
。
数据类型:字符
|字符串
'TrimNonNumeric'
-删除非数字字符假
(默认)|真正的
从一个数字变量除去非数字字符,指定为逻辑真正的
或假
。
例子:如果将名称-值对指定为'TrimNonNumeric',真
,则导入函数读取'$ 500 / - '
如500
。
数据类型:合乎逻辑
'ConsecutiveDelimitersRule'
-处理连续分隔符的过程“分裂”
|'加入'
|“错误”
处理带分隔符的文本文件中的连续分隔符的过程,指定为此表中的值之一。
连续分隔符规则 | 行为 |
---|---|
“分裂” |
将连续分隔符拆分为多个字段。 |
'加入' |
将分隔符连接为一个分隔符。 |
“错误” |
返回一个错误并中止导入操作。 |
数据类型:字符
|字符串
“LeadingDelimitersRule”
-管理前导分隔符的过程“保持”
|'忽视'
|“错误”
程序来管理一个分隔符的文本文件分隔符领先,指定此表中的值之一。
领先的分隔符规则 | 行为 |
---|---|
“保持” |
分隔符。 |
'忽视' |
忽略的分隔符。 |
“错误” |
返回一个错误并中止导入操作。 |
“表”
-阅读纸“”
空字符数组(默认)|特征向量|字符串标量|正标量整数读片从,指定为一个空字符阵列,字符向量或包含表名称串标量,或正标量整数表示的片索引。基于对指定的值表
属性,导入函数的行为如表中所述。
规范 | 行为 |
---|---|
“” (默认) |
从第一个工作表导入数据。 |
的名字 | 从匹配的工作表名称导入数据,而不考虑电子表格文件中工作表的顺序。 |
整数 | 在用整数表示的位置从工作表导入数据,而不考虑电子表格文件中的工作表名称。 |
数据类型:字符
|字符串
|单
|双
“UseExcel”
-标志启动Microsoft Excel的实例为Windows假
(默认)|真正的
标志开始的一个实例Microsoft Excel对于Windows在读取电子表格数据时,指定由逗号分隔的对组成“UseExcel”
,要么真正的
,或假
。
您可以设置“UseExcel”
其中一个值的参数:
真正的
-导入函数在读取文件时启动microsoftexcel的一个实例。
假
-导入函数在读取文件时不会启动microsoftexcel的实例。在此模式下操作时,导入函数功能在支持文件格式和交互式特性(如公式和宏)方面有所不同。万博1manbetx
UseExcel |
|
|
---|---|---|
万博1manbetx支持文件格式 |
|
|
万博1manbetx交互功能,如公式和宏支持 |
是的 |
没有 |
在Windows平台上从电子表格文件中读取时,如果希望启动Microsoft Excel,然后设置“UseExcel”
参数真正的
。
您单击对应于该MATLAB命令的链接:
通过在MATLAB命令窗口中输入该命令来运行它。Web浏览器不支持MATLAB命令。万博1manbetx
你也可以从以下列表中选择一个网站:
选择最佳的网站性能的中国网站(在中国或英文)。其他MathWorks的国家网站都没有从您的位置访问进行了优化。